我有这个父表[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)执行此操作?
答案 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'
类型地址的用户。它可能会返回与任何地址无关的用户。
答案 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'
);