SQL左连接 - 并且在on子句之后不起作用

时间:2015-06-17 08:41:56

标签: sql sql-server

我在SQL的左连接中有一个场景,它没有生成我需要的所需输出。以下是表格形式和我尝试过的查询的描述,

表A

A_ID        // PK OF TABLE A
IS_ACTIVE   // VALUE=1 OR 0

表B

B_ID        // PK OF TABLE B
A_ID        // FK OF TABLE A IN TABLE B

表A的样本记录

A_ID    IS_ACTIVE
1       1
2       0
3       1
4       0
5       0

表B的样本记录

B_ID    A_ID
1       1
2       1
3       4
4       4
5       4
6       4   
  

从A.A_ID = B.A_ID

上的左连接B中选择*
A_ID    IS_ACTIVE   B_ID    A_ID
1       1           1        1
1       1           2        1
2       0           NULL    NULL
3       1           NULL    NULL
4       0           3       4
4       0           4       4
4       0           5       4
4       0           6       4
5       0           NULL    NULL
  

从A.A_ID = B.A_ID和A.IS_ACTIVE = 0

上的左连接B中选择*

以下输出是上述查询的实际输出,通过在ON子句后添加AND is_active = 0来对记录没有影响。

A_ID    IS_ACTIVE   B_ID    A_ID
1       1           1        1
1       1           2        1
2       0           NULL    NULL
3       1           NULL    NULL
4       0           3       4
4       0           4       4
4       0           5       4
4       0           6       4
5       0           NULL    NULL

以下输出是必需输出,我需要解决我的问题。

A_ID    IS_ACTIVE   B_ID    A_ID
1       1           NULL    NULL
1       1           NULL    NULL
2       0           NULL    NULL
3       1           NULL    NULL
4       0           3       4
4       0           4       4
4       0           5       4
4       0           6       4
5       0           NULL    NULL

我在获取所需的确切记录时遇到问题。 我需要来自表A 的所有记录以及来自表B 的匹配记录,但是 那些表B 的记录等于表A 的is_active = 0。

注意:查询应显示表A

的所有记录

请帮助我如何在SQL的左连接中获得此方案。

2 个答案:

答案 0 :(得分:3)

我尝试将您的示例作为代码。我得到你需要的结果。有什么问题?

CREATE TABLE #a(a_id int, is_active bit)
CREATE TABLE #b(b_id int, a_id int)

INSERT INTO #a(a_id,is_active)
VALUES(1,1),(2,0),(3,1),(4,0),(5,0)

INSERT INTO #b(b_id,a_id)
VALUES(1,1),(2,1),(3,4),(4,4),(5,4),(6,4)

SELECT * 
FROM #a as a
LEFT JOIN #b as b
        ON a.a_id = b.a_id
        AND a.is_active = 0

DROP TABLE #a
DROP TABLE #b

答案 1 :(得分:0)

你试过了吗?

Select * from A left join B on A.A_ID=B.A_ID 
Where A.IS_ACTIVE=0