【问题标题】:SQL/Sybase: SELECT ... GROUP BY ... NOT HAVING?SQL/Sybase:SELECT ... GROUP BY ... 没有?
【发布时间】:2011-09-01 06:41:48
【问题描述】:
col1   col2
A      bear
A      dog
A      cat
B      bear
B      dog
B      cat
C      dog
C      cat
D      bear
D      dog
D      cat
E      bear
E      dog
E      cat
F      dog
F      cat

如果我想选择至少有一行 col2 = 'bear' 的所有 col1 值,我可以这样做:

SELECT col1 
FROM mytable 
WHERE col1 IN ('A','B','C') 
GROUP BY col1 
HAVING col2 = 'bear'

这将返回 A 和 B

但我只想从 col1 中选择没有 col2 = 'bear' 的行的值

我在想NOT HAVING,但这似乎不起作用。

有什么想法吗?谢谢!

【问题讨论】:

  • Having Col2 != 'bear' 能得到你需要的东西吗?
  • 虽然会返回 A、B 和 C,因为 col2 = 'cat''dog' 都满足 col2 != 'bear'
  • 不用担心。这些天我花在 SQL 上的时间不像以前那样多。 Where Not exists 是我的下一个建议,但它已经在答案中。

标签: sql group-by sybase


【解决方案1】:
SELECT m1.col1
     FROM mytable m1
     WHERE NOT EXISTS(SELECT NULL 
                          FROM mytable m2 
                          WHERE m2.col1 = m1.col1 
                              AND m2.col2 = 'bear')
         AND m1.col1 IN ('A', 'B', 'C')

【讨论】:

  • 太棒了,谢谢!我刚刚对其进行了编辑,以使其更接近现实,有很多行:我知道我可以将WHERE col1 IN (A,B,C) 添加到您的两个 SELECT 语句中,但是有没有更优雅的方法?
  • @carillonator:您只需将该条件添加到外部SELECT。我已编辑我的答案以反映这一变化。
【解决方案2】:

你也可以使用这个技巧:

SELECT col1 
FROM mytable
WHERE col1 IN ('A','B','C') 
GROUP BY col1 
HAVING SUM(CASE col2 WHEN 'bear' THEN 1 ELSE 0 END)=0

【讨论】:

  • 谢谢。当您已经在查询中加入了其他表时,这对我帮助很大,并且比上述解决方案更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多