排除具有分配给不同 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
的所有结果,其中 CustomerID
与 UserID
相同对应于一个重复的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 |
+------------+---------+
我正在尝试从 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
的所有结果,其中 CustomerID
与 UserID
相同对应于一个重复的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 |
+------------+---------+