不同列的不同值

时间:2017-05-24 07:24:38

标签: 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我在一列中得到结果。

这可行吗?

1 个答案:

答案 0 :(得分:2)

请尝试以下方法......

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中唯一值的编号列表。

然后在FULL OUTER JOINFULL JOIN的列表之间执行a(此处缩写为b),其记录号用作公共/加入值

注意:INNER JOIN只返回与两者中较短列表中的记录一样多的记录。只有LEFT JOIN左侧的列表长度大于或等于右侧列表时,JOIN才有效。类似的逻辑适用于RIGHT JOIN的使用。 FULL JOIN将以LEFT JOINRIGHT JOIN的方式加入这两个列表,而不管哪个列表更长。

然后在上面连接的数据集和FULL JOIN列表之间执行c,在a列表中找到一个公共值。

然后从最终加入的数据集中选择bcCOALESCE()的值,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' );

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

<强>附录

我的声明是针对使用以下脚本创建的数据库进行测试的......

COALESCE()

进一步阅读

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

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

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

https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql(在Transact-SQL中使用call