T-SQL中的一对多关系

时间:2013-11-11 13:50:18

标签: sql sql-server tsql

我需要弄清楚如何使用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表,我应该有我的列表。但是,我认为必须有一种更优雅的方式来做到这一点。有什么想法吗?

3 个答案:

答案 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

测试不同的方式会很有趣,因为查询计划通常不一样。