一尘不染

为列的每个不同类型提取多个相似的行

sql

输入

+--------+------+------+
|  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。我用简单的词来解释它,因为它是一个漫长而冗长的查询的一部分,并且我对如何解决这个问题有“零”的想法。我一直在使用创建临时表的技术,但是遇到了一些问题。它不是通用的。因此,我相信可能会对此问题有更好的解决方案。


阅读 104

收藏
2021-05-30

共1个答案

一尘不染

基本上,您可以获取所有水果中存在的记录,而无需name通过此查询进行操作,

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

两列的组中的记录总数:col2col3必须等于水果的总数。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
2021-05-30