Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别适用于不同数据集的记录的SQL查询_Sql_Sql Server_Tsql - Fatal编程技术网

识别适用于不同数据集的记录的SQL查询

识别适用于不同数据集的记录的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

我有一个如下的查询,它返回如下查询所示的结果。但是,我只需要这些数据的一个子集。我感兴趣的是获取仅与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 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 |
+------------+----------+----------------------+