mysql - 不同列的不同值

标签 mysql sql select

我不确定这是否可能。

我有一个包含 3 列的表格,我想获取每一列的不同值,有一个示例:

A      B        C
--------------------
a1     b1       c1
a1     b2       c2
a1     b3       c1 

预期结果是:

A      B       C
-----------------
a1     b1      c1
       b2      c2
       b3

因此,它将是以下内容的并集:

SELECT DISTINCT A FROM myTable
SELECT DISTINCT B FROM myTable
SELECT DISTINCT C FROM myTable

使用 UNION 我在一列中得到结果。

这可以做到吗?

最佳答案

请尝试以下操作...

SELECT COALESCE( a, '' ) AS a,
       COALESCE( b, '' ) AS b,
       COALESCE( c, '' ) AS c
FROM ( SELECT a,
              ROW_NUMBER() OVER ( ORDER BY a ) AS recordNumber
       FROM ( SELECT a
              FROM myTable
              GROUP BY a
            ) aFinder
     ) aNumberedFinder
FULL JOIN ( SELECT b,
                   ROW_NUMBER() OVER ( ORDER BY b ) AS recordNumber
            FROM ( SELECT b
                   FROM myTable
                   GROUP BY b
                 ) bFinder
          ) bNumberedFinder ON bNumberedFinder.recordNumber = aNumberedFinder.recordNumber
FULL JOIN ( SELECT c,
                   ROW_NUMBER() OVER ( ORDER BY c ) AS recordNumber
            FROM ( SELECT c
                   FROM myTable
                   GROUP BY c
                 ) cFinder
          ) cNumberedFinder ON cNumberedFinder.recordNumber = aNumberedFinder.recordNumber
                            OR cNumberedFinder.recordNumber = bNumberedFinder.recordNumber;

该语句以以下子查询开始...

SELECT a
FROM myTable
GROUP BY a

此子查询生成字段 a 中唯一值的列表。以下子查询使用记录(也称为行)编号重现此列表...

SELECT a,
       ROW_NUMBER() OVER ( ORDER BY a ) AS recordNumber
FROM ( SELECT a
       FROM myTable
       GROUP BY a
     ) aFinder

类似的子查询用于生成字段 bc 中唯一值的编号列表。

然后在 ab 列表之间执行 FULL OUTER JOIN(此处缩写为 FULL JOIN) code>,其记录编号用作公共(public)/连接值。

注意:INNER JOIN 只会返回两者中较短列表中的记录数。仅当 JOIN 左侧列表的长度大于或长于右侧列表时,LEFT JOIN 才会有效。类似的逻辑适用于 RIGHT JOIN 的使用。 FULL JOIN 将以 LEFT JOINRIGHT JOIN 的方式连接两个列表,无论哪个列表较长。

然后在上述连接的数据集和 c 列表之间执行 FULL JOIN,它在任一列表中找到公共(public)值。

然后使用 COALESCE()< 从最终连接的数据集中选择 abc 的值 函数用空字符串 ('') 替换出现的任何 NULL 值,例如由连接过程生成的值

如果您有任何问题或意见,请随时发表评论。

附录

我的语句针对使用以下脚本创建的数据库进行了测试...

CREATE TABLE myTable
(
    a   VARCHAR( 5 ),
    b   VARCHAR( 5 ),
    c   VARCHAR( 5 )
);
INSERT INTO myTable ( a,
                      b,
                      c
                    )
VALUES ( 'a1', 'b1', 'c1' ),
       ( 'a1', 'b2', 'c2' ),
       ( 'a1', 'b3', 'c1' );

进一步阅读

https://learn.microsoft.com/en-us/sql/t-sql/language-elements/coalesce-transact-sql (关于在 Transact-SQL 中使用 COALESCE() 函数)

https://www.w3schools.com/sql/sql_join.asp (关于各种类型的水平JOIN - 维恩图很有用)

https://technet.microsoft.com/en-us/library/ms187518(v=sql.105).aspx (关于在 SQL-Server 中使用OUTER JOIN)

https://learn.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql (关于在 Transact-SQL 中使用 ROW_NUMBER())

关于mysql - 不同列的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151662/

相关文章:

php - 按原型(prototype)订购

php - 如何使用二进制字段进行选择? (php,mysql)

mysql - 多列的 SQL 平均值

angularjs - 如何禁用 Angular JS 中的选项?

mysql - 不是唯一的表/别名 :

java - 我数据库中的所有数据都应该是可搜索的——MySQL 与 Lucene

mysql - 从 MySQL 表中的一个字段中选择一个不同的子字符串列表

php - mysql : select rows from table 1 and test if rows exists in table 2

mysql - 删除所有具有自动增量的字段并重置计数

mysql - 从 MySQL SELECT 中删除列