如何检查 SQL 中的一个组中的所有字段是否相等
How do I check if all of a field are equal in a group in SQL
所以我有类似的东西
prop1 | prop2
aaa | xxx
aaa | xxx
bbb | yyy
bbb | !yyy
ccc | zzz
ccc | zzz
现在我可以按 prop1 分组并得到 aaa、bbb、ccc,我可以单独检查它们并发现 bbb 的两个属性不匹配,
那么我如何用 sql 做到这一点?
如何只得到 'bbb' 作为我的结果?
我每组可能有 2 到很多。
让我们打电话给你的 table table1
。然后,以下查询将为您提供具有超过 1 个唯一值的 prop1
(或者,换句话说,对于相同的 prop1
,具有不同的 prop2
值):
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
值。
你可以试试这个。
DISTINCT
on prop1
和 prop2
删除重复数据。然后
得到 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
假设您的 属性 1 是您的 "key","proper" 在没有嵌套查询的情况下执行此操作的方法是使用左外连接。左外连接将搜索一个或多个具有相同 属性 1 的条目,并将 return 不同的 属性 1 与它们对应的 属性 2 值不匹配。这是一个例子:
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
基本上,它正在执行以下操作:
- Select 不同(非常自我解释)
- From table 1 as fp(别名 table 1 到 "fp" 所以你可以再次查询 table 1)
- 左外连接 table 1 as sp(第二次连接到相同的 table,并查询它们 return 只有 属性 的值1 个匹配,属性 2 个不匹配)
- Where 子句将其限制为仅 return 左外连接为真(即第二个 属性 不匹配)的结果
如果您的 属性 2 中有 100 个结果,并且想查看不匹配的结果,请将 sp.prop2 添加到 select 子句中,您将得到一个每个不匹配值的结果以及它匹配的 属性 1。
我会简单地使用 group by
和 having
:
select prop1
from t
group by prop1
having min(prop2) <> max(prop2);
所以我有类似的东西
prop1 | prop2
aaa | xxx
aaa | xxx
bbb | yyy
bbb | !yyy
ccc | zzz
ccc | zzz
现在我可以按 prop1 分组并得到 aaa、bbb、ccc,我可以单独检查它们并发现 bbb 的两个属性不匹配,
那么我如何用 sql 做到这一点?
如何只得到 'bbb' 作为我的结果?
我每组可能有 2 到很多。
让我们打电话给你的 table table1
。然后,以下查询将为您提供具有超过 1 个唯一值的 prop1
(或者,换句话说,对于相同的 prop1
,具有不同的 prop2
值):
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
值。
你可以试试这个。
DISTINCT
on prop1
和 prop2
删除重复数据。然后
得到 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
假设您的 属性 1 是您的 "key","proper" 在没有嵌套查询的情况下执行此操作的方法是使用左外连接。左外连接将搜索一个或多个具有相同 属性 1 的条目,并将 return 不同的 属性 1 与它们对应的 属性 2 值不匹配。这是一个例子:
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
基本上,它正在执行以下操作:
- Select 不同(非常自我解释)
- From table 1 as fp(别名 table 1 到 "fp" 所以你可以再次查询 table 1)
- 左外连接 table 1 as sp(第二次连接到相同的 table,并查询它们 return 只有 属性 的值1 个匹配,属性 2 个不匹配)
- Where 子句将其限制为仅 return 左外连接为真(即第二个 属性 不匹配)的结果
如果您的 属性 2 中有 100 个结果,并且想查看不匹配的结果,请将 sp.prop2 添加到 select 子句中,您将得到一个每个不匹配值的结果以及它匹配的 属性 1。
我会简单地使用 group by
和 having
:
select prop1
from t
group by prop1
having min(prop2) <> max(prop2);