我需要弄清楚如何使用T-SQL查找某组记录,并且我无法弄清楚如何创建WHERE
子句来执行此操作。
我有一个我正在使用的SQL 2008 R2系统,在这个数据库中有几个表。一个包含人事记录,另一个包含地址。地址与外键关系的人事记录有关。例如,要获得所有人员及其所有相关地址的列表(一个人可以有多个地址),我可以这样写:
SELECT id, name FROM personnel p
INNER JOIN address a
ON p.id = a.personnelid
但是,每个地址都有一个名为isprimary
的列,它是0或1.我需要做的是找出如何找到所有没有isprimary
相关地址的人员设置为1.或者没有主地址的记录。
目前我的想法是建立一个临时表,其中包含未标记为主要地址的人员。然后循环遍历这些并构建具有主地址的子集。
然后从非主要人员的结果中减去Personnel With Primary表,我应该有我的列表。但是,我认为必须有一种更优雅的方式来做到这一点。有什么想法吗?
答案 0 :(得分:5)
试试这个,它应该让所有Personnel行都没有匹配的主地址:
SELECT *
FROM Personnel p
WHERE NOT EXISTS
(SELECT * FROM Address a WHERE a.personnelId = p.id AND a.isprimary = 1)
答案 1 :(得分:0)
SELECT id, name FROM personnel p
INNER JOIN address a
ON p.id = a.personnelid
AND a.isprimary = 0
答案 2 :(得分:0)
这最终成为Left anti semi join模式 并且可以这样写:
SELECT id, name FROM personnel p
LEFT OUTER JOIN address a
ON p.id = a.personnelid
AND a.isprimary = 1
WHERE a.personnelId IS NULL
测试不同的方式会很有趣,因为查询计划通常不一样。