Sql 排除具有分配给其他表中非唯一字段的字段的结果

Sql 排除具有分配给其他表中非唯一字段的字段的结果,sql,sql-server,tsql,exists,Sql,Sql Server,Tsql,Exists,我试图从一个表tblRecords中进行选择,并排除具有在另一个表tblPerson中重复的值的行。作为一个直观的例子: 当前表格: tblRecords: tblPerson: +------------+-------------+ +------------+------------+ | CustomerID | OrderID | | PersonID | UserID | +------------+--------

我试图从一个表tblRecords中进行选择,并排除具有在另一个表tblPerson中重复的值的行。作为一个直观的例子:

当前表格:

 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 |
+------------+-------------+
这是一个简化的示例,因此请原谅表设计不好的迹象。由于PersonID“19”在tblPerson中出现多次,因此我想排除tblRecords中的所有结果,其中CustomerID与对应于重复PersonID的用户ID相同,因此排除100和101

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

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

我不知道如何修复查询,以便它知道从tblRecords中排除结果,其中CustomerID值出现在tblPerson中重复的PersonID旁边。此时,子查询选择我想要排除的确切值。我只是不知道它们在CustomerID中的逻辑搜索方式。

您可以在not exists查询的where子句中添加相关性:

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


编辑您的问题并提供示例数据和所需结果。这个问题相当没有意义,因为您在描述中似乎谈论的是一个表,但查询引用的是两个表。请阅读以获得改进问题的一些提示。@GordonLinoff我重写了这个问题。希望它更清楚。@HABO我重写了这个问题。希望它更清楚。祝贺30k+1@JuanCarlosOropeza谢谢看起来你也不算太远。虽然我的问题有点改变,但你添加的WHERE子句才是真正回答我问题的地方。谢谢@user7733611很乐意帮忙!
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
)
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
      )
    )
+------------+---------+
| CustomerID | OrderID |
+------------+---------+
|         18 |       7 |
|          8 |       1 |
+------------+---------+