sql查询查找列数据的唯一组合

Posted

技术标签:

【中文标题】sql查询查找列数据的唯一组合【英文标题】:sql query to find unique combination of column data 【发布时间】:2014-01-17 01:31:11 【问题描述】:

我正在尝试编写 sql 查询,该查询将从表中选择不同的列组合。

示例表数据:

+--+---+---+---+
|id|fk1|fk2|fk3|
+--+---+---+---+
|1 |1  |2  |3  |
+--+---+---+---+
|2 |1  |3  |3  |
+--+---+---+---+
|3 |2  |2  |3  |
+--+---+---+---+
|4 |2  |4  |3  |
+--+---+---+---+
|5 |3  |2  |3  |
+--+---+---+---+
|6 |3  |3  |3  |
+--+---+---+---+
|7 |3  |4  |3  |
+--+---+---+---+

在这里我需要编写一个返回 fk1 => 2 的查询,因为它具有 fk2 => 2 and 4 的唯一组合

如果问题不清楚,请告诉我。

谢谢

【问题讨论】:

为什么“2”是唯一的组合,而不是“1”?两者都与“3”完全相交。 因为我正在寻找 fk2 => 2 和 4 组合的行 您正在寻找 fk2 => 2 或 fk2 => 4 的行?还是您的意思是您需要 fk2 = 2 和 fk2 = 4 的所有行? @SharikovVladislav fk2 => 2 和 4 是查询的输入。并且输出应该是 fk1 => 2 【参考方案1】:

我明白了。值“2”和“4”是查询的输入,而您正是需要这种组合。这是一个 set-within-sets 查询,我认为使用 having 子句进行聚合是最灵活的方法。

select fk1
from table t
group by fk1
having sum(fk2 = 2) > 0 and
       sum(fk2 = 4) > 0 and
       sum(fk2 not in (2, 4)) = 0;

即键fk1的值为2(至少一次),值为4,没有其他值。

【讨论】:

嗨@Gordon,你的假设是正确的。但我只是试了一下,对我来说它什么也没返回。此外,对查询功能的解释将在未来有所帮助。谢谢。 这是一个 SQL Fiddle,它证明了它的工作原理 (sqlfiddle.com/#!2/90ace/1)。 谢谢。它确实有效。我对引号有一些疑问。 @Subash 。 . .这是 mysql 语法,用于计算 fk2 值为 2 的行数。 计算值不是 2 或 4 的行数。只有 fk1 没有此类行的值通过。

以上是关于sql查询查找列数据的唯一组合的主要内容,如果未能解决你的问题,请参考以下文章

SQL主外键,子查询

如果行在其他列中具有相同的数据,则 SQL 查询 CONCAT/列出唯一列数据?

在 SQL 数据库中查找列名的所有唯一值

数据库开发基础-SQl Server 主键外键子查询(嵌套查询)

SQL主外键和子查询

使用 SQL 查询查找 Informix 表和列详细信息