首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询以标识适用于一组不同数据的记录

SQL查询以标识适用于一组不同数据的记录
EN

Stack Overflow用户
提问于 2017-08-10 17:03:59
回答 3查看 33关注 0票数 1

我有以下查询,它返回结果,如下所示。然而,我只需要这些数据的一个子集。我感兴趣的是获取仅与RegionID值2相关联而不与任何其他区域相关联的DocumentID。

代码语言:javascript
复制
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 

查询结果:

代码语言:javascript
复制
+------------+----------+---------------------+
| DocumentID | RegionID | NUMOFPLANTSBYREGION |
+------------+----------+---------------------+
|       2126 |        2 |                   8 |
|       2127 |        2 |                   8 |
|       2128 |        2 |                   8 |
|       2129 |        2 |                   8 |
|       2130 |        2 |                   8 |
|       2134 |        4 |                  13 |
|       2135 |        3 |                   8 |
|       2136 |        6 |                   9 |
|       2137 |        2 |                   8 |
|       2138 |        3 |                   8 |
|       2138 |        1 |                  20 |
|       2138 |        6 |                   9 |
|       2138 |        4 |                  14 |
|       2138 |        2 |                   8 |
|       2139 |        1 |                  17 |
|       2140 |        1 |                  17 |
+------------+----------+---------------------+

我感兴趣的结果如下:

其他记录要么不适用于2的区域ID,要么适用于除2以外的更多区域,因此应排除。

代码语言:javascript
复制
+------------+----------+----------------------+
| DocumentID | RegionID | NUMOFPLANTSBYREGION  |
+------------+----------+----------------------+
|       2126 |        2 |                    8 |
|       2127 |        2 |                    8 |
|       2128 |        2 |                    8 |
|       2129 |        2 |                    8 |
|       2130 |        2 |                    8 |
|       2137 |        2 |                    8 |
+------------+----------+----------------------+
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-10 17:13:43

使用公共表表达式not exists()

代码语言:javascript
复制
;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
  )

rextester演示:http://rextester.com/DUIE27467

返回:

代码语言:javascript
复制
+------------+----------+----------------------+
| DocumentID | RegionID | NUMOFPLANTSBYREGION  |
+------------+----------+----------------------+
|       2126 |        2 |                    8 |
|       2127 |        2 |                    8 |
|       2128 |        2 |                    8 |
|       2129 |        2 |                    8 |
|       2130 |        2 |                    8 |
|       2137 |        2 |                    8 |
+------------+----------+----------------------+
票数 2
EN

Stack Overflow用户

发布于 2017-08-10 17:06:30

代码语言:javascript
复制
  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 
票数 1
EN

Stack Overflow用户

发布于 2017-08-10 17:08:33

您可以使用这种方法,实现减号语句(顺便说一下,在MySQL中不存在):

代码语言:javascript
复制
SELECT DocumentID FROM docs WHERE RegionID=2 AND DocumentID NOT IN (SELECT DocumentID FROM docs WHERE RegionID<>2)

我也在http://sqlfiddle.com/#!9/66f0e8/57上试过了,看起来很管用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45619641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档