我不确定是否可能。
我有一个包含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我在一列中得到结果。
这可行吗?
答案 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
类似的子查询用于生成字段b
和c
中唯一值的编号列表。
然后在FULL OUTER JOIN
和FULL JOIN
的列表之间执行a
(此处缩写为b
),其记录号用作公共/加入值
注意:INNER JOIN
只返回与两者中较短列表中的记录一样多的记录。只有LEFT JOIN
左侧的列表长度大于或等于右侧列表时,JOIN
才有效。类似的逻辑适用于RIGHT JOIN
的使用。 FULL JOIN
将以LEFT JOIN
或RIGHT JOIN
的方式加入这两个列表,而不管哪个列表更长。
然后在上面连接的数据集和FULL JOIN
列表之间执行c
,在a
列表中找到一个公共值。
然后从最终加入的数据集中选择b
,c
和COALESCE()
的值,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
)