我有这个问题,我无法解决。与此类似:假设我有一个表格,上面有关于船只的信息;有一个ship_id列,每艘船都有很多行。现在,有两个相似的数值属性,分别为attr1attr2

一次考虑一艘船,有时attr1对于所有船行都有一个值,而attr2有多个值,例如1, 2, 3, ...。有时attr2具有单个值,而attr1具有多个值。如何检查是否有两个属性都不同的船??

这是一个示例表,以防万一:

ship_id     attr1    attr2 ...
  101         1        10
  101         1        11
  101         1        15
  101         1        20
  ...
  201         5        200
  201         6        200
  201         15       200
  201         20       200
  ...


在这里,attr1对于船101来说永不变化,而attr2对于船201则永不变化。我想找到两个属性都可以变化的船。

我写了以下内容,它可以正常运行,但是我不确定它是否在执行我的预期。分组+ DISTINCT使我头晕目眩...

SELECT ship_id, count(DISTINCT attr1) as c1, count(DISTINCT attr2) as c2
FROM ships
GROUP BY ship_id
HAVING c1 > 1 and c2 > 1;

最佳答案

如果我理解正确,则可以使用EXISTS

SELECT s.*
FROM ships s
WHERE EXISTS (SELECT 1
              FROM ships s1
              WHERE s1.ship_id = s.ship_id AND s1.attr1 <> s.attr1 AND s1.attr2 <> s.attr2
             );

10-05 22:51