没有子行类型的SQL提取父级

时间:2015-11-30 10:45:33

标签: sql sql-server database tsql

我有这个父表[USERS]:

ID  |   NAME
1   |   Pippo
2   |   Pluto
3   |   Topolino
4   |   Paperino

每个用户都有地址(一对多) 这是孩子表[ADDRESSES]:

ID  |   ADDRESS     |   TYPE    |   USER_ID
99  |   pippo@rmail |   R       |   1
100 |   pippo@qmail |   Q       |   1
101 |   pluto@rmail |   R       |   2
102 |   pluto@qmail |   Q       |   2
103 |   topo@mail   |   R       |   3
104 |   duck@mail   |   R       |   4

我想SQL提取所有没有[TYPE]'Q'地址的用户。 我的查询应该只提取“topolino”和“paperino”USERS行......

如何使用SQL(或更好的TSQL)执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS

SELECT u.ID, u.NAME
FROM USERS AS u
WHERE NOT EXISTS (SELECT 1
                  FROM ADDRESSES AS a
                  WHERE u.ID = a.USER_ID AND a.TYPE = 'Q')

这将返回所有不具有'Q'类型地址的用户。它可能会返回与任何地址无关的用户。

Demo here

答案 1 :(得分:1)

您可以使用EXISTS

执行此操作
SELECT *
   FROM [USERS] U
   WHERE NOT EXISTS
      (
         SELECT *
            FROM [ADDRESSES] A
            WHERE A.USER_ID = U.ID
               AND A.TYPE = 'Q'
      );

另一种方法是使用IN子句

SELECT *
   FROM [USERS]
   WHERE ID NOT IN
      (
         SELECT USER_ID
            FROM [ADDRESSES]
            WHERE TYPE = 'Q'
      );