如何在SQL中检查一组字段是否全部相等

4

所以我有类似以下的东西

 prop1 | prop2
 aaa   | xxx
 aaa   | xxx
 bbb   | yyy
 bbb   | !yyy
 ccc   | zzz
 ccc   | zzz

现在,我可以按prop1分组并获得aaa、bbb、ccc,我可以逐个检查它们,发现bbb的两个属性不匹配。

那么我该如何使用SQL实现这一点?

如何只获取“bbb”作为我的结果?

每个组中可能有2个或更多元素。


1
根据您上面展示的样本数据,您期望的输出是什么? - brianyates
1
那么它只需要是 SELECT * FROM table WHERE prop1='bbb' 吗? - brianyates
只返回翻译后的文本:如果还有其他行,如“ddd | qqq,ddd |!qqq”,那么我将获取“bbb”和“ddd” - Doopdon
1
你的意思是 SELECT * FROM table GROUP BY prop1, prop2 HAVING count(distinct prop2) > 1; 吗? - Ereli
尝试这个代码:SELECT *,count(distinct prop2) as cnt FROM table GROUP BY prop1 having cnt>1 - Ereli
显示剩余3条评论
4个回答

7

我会简单地使用 group byhaving

select prop1
from t
group by prop1
having min(prop2) <> max(prop2);

4
你可以尝试这个方法:

DISTINCTprop1prop2 上执行,删除重复的数据,然后获取 COUNT 大于 1 的结果。

SELECT prop1    
FROM (
  SELECT DISTINCT prop1,prop2
  FROM t
)t
GROUP BY prop1
HAVING COUNT(*) > 1

sqlfiddle:http://sqlfiddle.com/#!9/e2a10c/1


这比必要的更复杂,性能也不如必要。 - Gordon Linoff

1
假设你的属性1是你的“键”,在不使用嵌套查询的情况下,正确的方法是使用左外连接。左外连接将搜索具有相同属性1的一个或多个条目,并返回其对应的属性2值不匹配的唯一属性1。以下是一个例子:
select distinct fp.prop1
 from table1 as fp
 left outer join table1 as sp on fp.prop1 = sp.prop1 and fp.prop2 != sp.prop2
 where sp.prop2 is not null

这里有一个 SQLFiddle 证明它是可行的: http://sqlfiddle.com/#!17/2729b/6

基本上,它执行以下操作:

  • 选择不同的值(非常清晰易懂)
  • 从表1作为fp(将表1别名为“fp”,以便您可以对表1进行第二次查询)
  • 左外连接表1作为sp(第二次连接相同的表,并针对它们进行查询,仅在属性1匹配且属性2不匹配时返回值)
  • Where 子句限制只返回左外连接为真的结果(即第二个属性不匹配的位置)

如果您的属性2中有数百个结果,并且想要查看不匹配的结果,请将 sp.prop2 添加到您的选择子句中,您将得到每个不匹配值的一个结果以及它匹配的属性1。


0

我们称您的表为table1。然后,以下查询将为您提供具有超过1个唯一值(或者换句话说,具有不同的prop2值的prop1)的prop1

SELECT
    x.prop1,
    COUNT(1)
FROM (
    SELECT
        t.prop1,
        t.prop2
    FROM
        table1 t
    GROUP BY
        t.prop1,
        t.prop2
) x
GROUP BY
    x.prop1
HAVING
    COUNT(1) > 1

这个答案还会告诉你相关的prop1有多少不同的prop2值。


这将返回所有三个 prop1 的值。 - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,