我不确定这是否可能。
我有一个包含 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
类似的子查询用于生成字段 b
和 c
中唯一值的编号列表。
然后在 a
和 b
列表之间执行 FULL OUTER JOIN
(此处缩写为 FULL JOIN
) code>,其记录编号用作公共(public)/连接值。
注意:INNER JOIN
只会返回两者中较短列表中的记录数。仅当 JOIN
左侧列表的长度大于或长于右侧列表时,LEFT JOIN
才会有效。类似的逻辑适用于 RIGHT JOIN 的使用。 FULL JOIN
将以 LEFT JOIN
或 RIGHT JOIN
的方式连接两个列表,无论哪个列表较长。
然后在上述连接的数据集和 c
列表之间执行 FULL JOIN
,它在任一列表中找到公共(public)值。
然后使用 COALESCE()< 从最终连接的数据集中选择
函数用空字符串 (a
、b
和 c
的值''
) 替换出现的任何 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/