繁体   English   中英

从多行中选择ID,其中列值满足一个条件,但不满足另一个条件

[英]Select IDs from multiple rows where column values satisfy one condition but not another

您好我有以下问题。

我在此sql小提琴中有一个表,该表定义了一种关系,并且包含来自其他两个表的ID

示例值

| FirstID  | SecondID  | 
|  1       |     1     |
|  1       |     2     |
|  1       |     3     |
|  2       |     1     |
|  2       |     2     |
|  2       |     3     |
|  2       |     4     |
|  2       |     5     |
|  3       |     1     |
|  3       |     2     |
|  3       |     3     |

我要选择满足以下条件的所有FirstID。 它们对应的SecondID在1-3范围内,而不在4-5范围内

例如,在这种情况下,我们需要FirstID 1和3。

我已经尝试了以下查询

SELECT FirstID from table 
WHERE SecondID IN (1,2,3) AND SecondID NOT IN (4,5)

SELECT  FirstID,SecondID
FROM(
   SELECT FirstID, SecondID
   FROM  table
   WHERE  SecondID in (1,2,3,4,5) ) 
WHERE SecondID NOT IN (4,5)

但是我没有得到我想要的正确结果。

什么是获取我想要的数据的正确查询?

SELECT FirstID
FROM table
WHERE SecondId in (1,2,3) --Included values
AND FirstID NOT IN (SELECT FirstID FROM test
                    WHERE SecondId IN (4,5)) --Excluded values

min()max()怎么样:

select firstid
from t
group by firstid
having min(secondId) between 1 and 3 and
       max(secondid) between 1 and 3;

假设1为最小值,则可以简化为:

having max(secondid) <= 3;

对于任意范围,可以使用sum(case)

having sum(case when secondId between 1 and 3 then 1 else 0 end) > 0 and
       sum(case when secondId between 4 and 5 then 1 else 0 end) = 0;

我认为Gonzalo Lorieto可能已经很好地回答了这个问题,但是根据数据的大小, WHERE子句中的SELECT语句可能会变得非常慢,而下面的语句可能会更快(尽管目前尚不清楚这是否值得)可读性降低...)

SELECT inrange.FirstId FROM 
t inrange
LEFT OUTER JOIN 
(SELECT FirstID FROM t
WHERE SEcondId IN (4,5)) outrange
ON inrange.firstID = outrange.firstId
WHERE SecondID IN (1,2,3)
AND outrange.firstId IS NULL
GROUP BY inrange.FirstId

您将要使用EXISTS子句排除具有无效SecondID的FirstID。 这是一个例子:

SELECT FirstID from test Has123
WHERE SecondID IN (1,2,3)
AND NOT EXISTS (
  SELECT 1 FROM test Not45 
  WHERE Has123.FirstID = Not45.FirstID 
  AND Not45.SecondID IN (4,5)
)
GROUP BY FirstID

SqlFiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM