排除具有分配给不同 table 中的非唯一字段的字段的结果

Excluding results that have a field that is assigned to a non-unique field in a different table

我正在尝试从 table (tblRecords) 中 select 并排除值在不同的 table (tblPerson).作为一个视觉示例:

当前table秒:

 tblRecords:                    tblPerson:
+------------+-------------+   +------------+------------+
| CustomerID | OrderID     |   | PersonID   | UserID     |
+------------+-------------+   +------------+------------+
| 101        |           1 |   | 8          | 3004       |
| 18         |           7 |   | 5          | 81         |
| 8          |           1 |   | 19         | 100        |
| 100        |           2 |   | 19         | 101        |
+------------+-------------+   +------------+------------+

期望的输出:

+------------+-------------+
| CustomerID | OrderID     |
+------------+-------------+
| 18         |           7 |
| 8          |           1 |
+------------+-------------+

这是一个简化的示例,因此请原谅 table 设计不当的迹象。由于 PersonID '19' 在 tblPerson 中出现不止一次,我想排除 tblRecords 的所有结果,其中 CustomerIDUserID 相同对应于一个重复的PersonID(因此排除100和101)。

不是按重复值分组,我认为解决方案是在查询的 WHERE 子句中使用 NOT EXISTS。这是我写的查询,它没有按预期工作:

SELECT *
FROM  tblRecords
WHERE NOT EXISTS (
    SELECT PersonID
    FROM tblPeople
    GROUP BY PersonID
    HAVING COUNT(PersonID) > 1
)

我不明白如何修复查询,因此它知道从 tblRecords 中排除结果,其中 CustomerID 值出现在 [=15] 中重复的 PersonID 旁边=].目前,子查询 selects 是我想要排除的确切值。我只是不知道如何在 CustomerID.

中按逻辑搜索它们

您可以在 not exists() 查询的 where 子句中添加关联:

SELECT *
FROM  ISOW.dbo.tblRecords r
WHERE NOT EXISTS (
    SELECT PersonID
    FROM ISOW.dbo.tblPeople p
    where p.PersonID= r.CustomerID 
    GROUP BY PersonID
    HAVING COUNT(PersonID) > 1
)

对于更新后的问题,使用 not exists()exists():

select r.CustomerID, r.OrderID
from  dbo.tblRecords r
where not exists (
    select PersonID
    from dbo.tblPeople p
    where p.UserID= r.CustomerID 
      and exists (
        select 1
        from dbo.tblPeople i
        where i.PersonID = p.PersonID
          and i.UserID <> p.UserID
      )
    )

rextester 演示:http://rextester.com/DNWK20907

returns:

+------------+---------+
| CustomerID | OrderID |
+------------+---------+
|         18 |       7 |
|          8 |       1 |
+------------+---------+