识别适用于不同数据集的记录的SQL查询
我有一个如下的查询,它返回如下查询所示的结果。但是,我只需要这些数据的一个子集。我感兴趣的是获取仅与RegionID值2关联而不与任何其他区域关联的DocumentID识别适用于不同数据集的记录的SQL查询,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个如下的查询,它返回如下查询所示的结果。但是,我只需要这些数据的一个子集。我感兴趣的是获取仅与RegionID值2关联而不与任何其他区域关联的DocumentID SELECT D.DocumentID, R.RegionID, COUNT(*) AS NUMOFPLANTSBYREGION FROM Document D INNER JOIN ShopAreaDoc SAD ON D.DocumentID = SAD.DocumentID INNER JOIN PlantShopAr
SELECT D.DocumentID, R.RegionID, COUNT(*) AS NUMOFPLANTSBYREGION
FROM Document D INNER JOIN ShopAreaDoc SAD ON D.DocumentID = SAD.DocumentID
INNER JOIN PlantShopAreaDoc PSAD ON SAD.ShopAreaDocID = PSAD.ShopAreaDocID
INNER JOIN Plant P ON PSAD.PlantID = P.PlantID
INNER JOIN Region R ON P.RegionID = R.RegionID
GROUP BY D.DocumentID, R.RegionID
ORDER BY D.DocumentID
查询结果:
我感兴趣的结果集如下:
其他记录要么不适用于区域ID为2,要么适用于除2以外的更多区域,因此应排除在外
+------------+----------+----------------------+
| DocumentID | RegionID | NUMOFPLANTSBYREGION |
+------------+----------+----------------------+
| 2126 | 2 | 8 |
| 2127 | 2 | 8 |
| 2128 | 2 | 8 |
| 2129 | 2 | 8 |
| 2130 | 2 | 8 |
| 2137 | 2 | 8 |
+------------+----------+----------------------+
您可以使用这种方法,通过以下方式实现MySQL中不存在的减号语句:
SELECT DocumentID FROM docs WHERE RegionID=2 AND DocumentID NOT IN (SELECT DocumentID FROM docs WHERE RegionID<>2)
我也试过了,它似乎很管用。使用了一个不存在的:
这也将返回ID2138,因为它是区域2、1、3和4、6的一部分,OP希望将其作为需求的一部分排除。@JacobH没有注意到这些记录。请参阅修订版。@vmrao很乐意提供帮助!
SELECT D.DocumentID, R.RegionID, COUNT(*) AS NUMOFPLANTSBYREGION
FROM Document D
INNER JOIN ShopAreaDoc SAD ON D.DocumentID = SAD.DocumentID
INNER JOIN PlantShopAreaDoc PSAD ON SAD.ShopAreaDocID = PSAD.ShopAreaDocID
INNER JOIN Plant P ON PSAD.PlantID = P.PlantID
INNER JOIN Region R ON P.RegionID = R.RegionID
WHERE R.RegionId = 2
AND NOT EXISTS (SELECT * FROM Region R2 WHERE R2.RegionId <> 2 AND R2.DocumentId = D.documentid)
GROUP BY D.DocumentID, R.RegionID
ORDER BY D.DocumentID
SELECT DocumentID FROM docs WHERE RegionID=2 AND DocumentID NOT IN (SELECT DocumentID FROM docs WHERE RegionID<>2)
;with cte as (
SELECT D.DocumentID, R.RegionID, COUNT(*) AS NUMOFPLANTSBYREGION
FROM Document D INNER JOIN ShopAreaDoc SAD ON D.DocumentID = SAD.DocumentID
INNER JOIN PlantShopAreaDoc PSAD ON SAD.ShopAreaDocID = PSAD.ShopAreaDocID
INNER JOIN Plant P ON PSAD.PlantID = P.PlantID
INNER JOIN Region R ON P.RegionID = R.RegionID
GROUP BY D.DocumentID, R.RegionID
)
select *
from cte
where not exists (
select 1
from cte i
where i.DocumentID = cte.DocumentID
and i.RegionID <> 2
)
+------------+----------+----------------------+
| DocumentID | RegionID | NUMOFPLANTSBYREGION |
+------------+----------+----------------------+
| 2126 | 2 | 8 |
| 2127 | 2 | 8 |
| 2128 | 2 | 8 |
| 2129 | 2 | 8 |
| 2130 | 2 | 8 |
| 2137 | 2 | 8 |
+------------+----------+----------------------+