SQL三表查询表

时间:2015-04-03 12:45:37

标签: sql sql-server

我有3张桌子

table a             table b                        table c
+--------+          ---------+-------            ------+-------+
| ID     |              ID  | STATUS|             ID  | STATUS|
+--------+         ---------+--------            -----+--------+
| 1      |              4   |  A    |              6  | A
| 2      |              5   | NULL  |              5  |NULL
| 3      |              1   | A     |              3  | A
| 9      |              2   | NULL  |              1  | NULL

现在我想要一个表B和C的记录,它与TABLE A ID

相匹配

我写了一个查询

SELECT DISTINCT ID 
FROM
  (SELECT a.ID,b.STATUS FROM A a B b where a.ID=b.ID
   UNION
   SELECT a.ID,C.STATUS 
   FROM A a,C C 
   WHERE a.ID=C.ID) as T

它返回3条记录

但是当我附加条件T.STATUS =' A'

SELECT DISTINCT ID 
FROM
  (SELECT a.ID,b.STATUS FROM A a B b
   WHERE a.ID=b.ID
   UNION
   SELECT a.ID,C.STATUS 
   FROM A a,C C 
   WHERE a.ID=C.ID) as T 
WHERE T.STATUS='A'

它返回2条记录

我再次更改了WHERE条件,因为T.STATUS为空

SELECT DISTINCT ID FROM
 (SELECT a.ID,b.STATUS 
  FROM A a,B b
  WHERE a.ID=b.ID
  UNION 
  SELECT a.ID,C.STATUS
  FROM A a,C C
  WHERE a.ID=C.ID) as T
WHERE T.STATUS is null

它返回2条记录

共有4个RECORDS,但我的第一个查询没有where条件它返回3

这种不匹配怎么样?我知道它的查询问题但是

我想将where where条件应用于只有3条记录(没有where条件返回结果的查询)。

1 个答案:

答案 0 :(得分:4)

您正在选择distinct idid = 1的行包含“A”和“{1}}。结果很有意义。

我会将查询写成:

NULL

请注意,您的原始查询至少有一个语法错误。您应该学习正确的显式SELECT DISTINCT ID FROM (SELECT a.ID, b.STATUS FROM A a JOIN B b ON a.ID=b.ID UNION SELECT a.ID, C.STATUS FROM A a JOIN C C WHERE a.ID = C.ID ) T 语法。简单规则:切勿在{{1​​}}子句中使用逗号。