4

输入

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| apple  | d    |   10 |
| apple  | d    |   44 |
| apple  | e    |   55 |
| orange | d    |   99 |
| orange | c    |   33 |
| orange | d    |   10 |
| banana | e    |   55 |
| banana | d    |   10 |
+--------+------+------+

所需输出

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| apple  | d    |   10 |
| orange | d    |   10 |
| banana | d    |   10 |
+--------+------+------+

我们将检查 col2 和 col3 是否有 N 种不同类型的水果。

我们只想列出 col2 和 col3 值相同且所有水果都存在该行的那些

扩展解释:

你可以这样想:-

第1步

将所有不同类型的水果分开:-

苹果:-

+-------+------+------+
| col1  | col2 | col3 |
+-------+------+------+
| apple | d    |   10 |
| apple | d    |   44 |
| apple | e    |   55 |
+-------+------+------+

橙子:-

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| orange | d    |   99 |
| orange | c    |   33 |
| orange | d    |   10 |
+--------+------+------+

香蕉:-

+--------+------+------+
|  col1  | col2 | col3 |
+--------+------+------+
| banana | e    |   55 |
| banana | d    |   10 |
+--------+------+------+

第2步:-

现在只选择那些

  • 具有相同的 col2 和 col3 值

  • 它存在于所有类型的水果中。

观察:-

'apple e 55' 和 'banana e 55' 具有相同的 col2 和 col3 值,但未选择它,因为不存在 'orange e 55'。

如果您使用的是临时表,请确保它应该是通用的。它应该支持 N 个水果。

注意:- 这不是学生的作业:D。我用简单的话来解释它,因为它是一个漫长而冗长的查询的一部分,我对如何解决它的想法为零。我一直在使用一种创建临时表的技术,但我遇到了一些问题。它不是通用的。所以,我相信这个问题可能会有更好的解决方案。

4

1 回答 1

5

name基本上,无论通过此查询,您都可以获取所有水果中存在的记录,

SELECT  col2, col3
FROM    tableName
GROUP   BY col2, col3
HAVING  COUNT(*) = (SELECT COUNT(DISTINCT col1) FROM tableName)

一组两列中的记录总数:col2并且col3必须等于水果的总数。SELECT COUNT(DISTINCT col1) FROM tableName.

因此,要获取所有水果中存在组合的所有记录,我们需要JOIN使用表本身来获取它。

SELECT  a.*
FROM    tableName a
        INNER JOIN
        (
            SELECT  col2, col3
            FROM    tableName
            GROUP   BY col2, col3
            HAVING  COUNT(*) = (SELECT COUNT(DISTINCT col1) FROM tableName)
        ) b ON a.col2 = b.col2 AND
                a.col3 = b.col3
于 2013-09-12T19:25:02.313 回答