2014-02-22 47 views
2

我试过寻找这个,我不太确定如何确切地说明我要做什么,但是我会展示我得到的和我想要的是。此外,我的第一个问题在这里,所以我很抱歉,如果我得到任何错误!当找到第二列值时,根据列值排除行

首先,我有这样的链接表的外键:

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

现在,我想告诉我的所有的ID在该表中,其中Value!=70。我试过了;

SELECT * FROM table WHERE Value != 70 

这消除了70值,现在将显示行1:1302:60。但是我怎么去排除匹配的列中的所有值。例如。如果我说不显示任何ID与他们关联的值70,我应该只得到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 

但这些工作。就像我说过的,我不确定如何说出我以后的话,但任何帮助将不胜感激。

回答

3
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) 
+0

代码的第一部分效果很好。谢谢! –

0

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

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

我不知道如果我理解得很好,但也许这?

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

我使用 'NOT IN',而不是!=因为它可能是不止一个ID关联值的70

你也coud使用:

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

你的第二次尝试非常接近解决这个问题的方法之一。所述where子句仅仅需要改变到having条款(连同小变化到逻辑):

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

having子句中的表达进行计数的行数,其中value等于70。你不想要这样的行,因此= 70。这种查询形式非常灵活。使用having子句可以检查更复杂的条件,如没有7071

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

或者没有70但有71

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

和更复杂的组合。