0

我需要弄清楚如何使用 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 的人员。或者没有主地址的记录。

目前我的想法是建立一个临时表,其中包含未标记为主要地址的人员。然后循环遍历这些并构建一个具有主地址的子集。

然后从非主要人员的结果中减去主要人员表,我应该有我的列表。但是,我认为必须有一种更优雅的方式来做到这一点。有任何想法吗?

4

3 回答 3

5

试试这个,它应该得到所有没有匹配主地址的 Personnel 行:

SELECT *
FROM Personnel p
WHERE NOT EXISTS
   (SELECT * FROM Address a WHERE a.personnelId = p.id AND a.isprimary = 1)
于 2013-11-11T13:54:36.557 回答
0
SELECT id, name FROM personnel p
INNER JOIN address a
ON p.id = a.personnelid
AND a.isprimary = 0
于 2013-11-11T13:55:58.690 回答
0

这最终成为一个左反半连接模式,可以这样写:

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

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

于 2013-11-13T22:46:50.960 回答