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