繁体   English   中英

找到第二个列值时,根据列值排除行

[英]Exclude rows based on column value when second column value is found

我尝试搜索此内容,但我不确定如何准确表达我所追求的内容,但是我将展示我所拥有的和我想要的。 这也是我的第一个问题,如果您遇到任何问题,我深表歉意!

首先,我有一个带有外键的链接表:

|ID|Value|
+--+-----+
|1 |   70|
|1 |  130|
|2 |   60|

现在,我试图向我显示此表中Value!=70所有ID。 我试过了;

SELECT * FROM table WHERE Value != 70

这将删除70值,现在将显示行1:1302:60 但是我将如何排除匹配的列中的所有值。 例如,如果我说不给我显示任何与它们关联的值为70的ID,则我应该只获取ID为2的行。 我试过了;

SELECT DISTINCT * FROM table WHERE Value != 70

SELECT * FROM table WHERE Value != 70 GROUP BY ID

SELECT DISTINCT * FROM table WHERE Value != 70 GROUP BY ID

但这些都不起作用。 就像我说过的那样,我不确定该如何表达自己的意思,但是任何帮助将不胜感激。

Select * From table 
where id Not In 
        (Select distinct id 
         From table
         Where value = 70)

要么

Select * From table t
where Not exists
        (Select * From table
         where id = t.id
            and value = 70)   

您可以使用子查询和NOT IN条件

SELECT tb.* FROM table tb
WHERE tb.ID NOT IN 
(
    SELECT a.ID FROM table a where a.Value = 70
)

我不知道我是否了解您,但这也许是吗?

SELECT * FROM table WHERE ID NOT IN (
  SELECT ID FROM table WHERE Value = 70
)

我使用'NOT IN'而不是!=因为它可能是多个ID,其关联值为70。

您也可以使用:

SELECT * FROM table t1 WHERE NOT EXISTS(
  SELECT 1 FROM table t2 WHERE t2.ID = t1.ID AND t2.value = 70
)

您的第二次尝试非常接近解决此问题的一种方法。 仅需将where子句更改为having子句(以及对逻辑的少量更改):

SELECT ID
FROM table t
GROUP BY ID
HAVING sum(Value = 70) = 0;

having子句中的表达式计算value等于70的行数。 您不希望有这样的行,因此= 70 这种查询形式非常灵活。 使用hading子句可以检查更复杂的条件,例如不具有7071

HAVING sum(Value = 70) = 0 AND
       sum(Value = 71) = 0;

或不具有70但具有71

HAVING sum(Value = 70) = 0 AND
       sum(Value = 71) > 0;

以及更复杂的组合。

暂无
暂无

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

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