说我有这样一张桌子:
我想创建一个select,它将每个非null行与其他所有值组合在一起,以便最终得到:
等,一直到3 - 3 - 3
这可以在一个选择语句中完成吗?
答案 0 :(得分:2)
由于您想要组合现在在不同行上的值,首先需要在子查询中分隔它们(with
语句),然后您可以交叉连接这些(笛卡尔积)以查找所有不同的组合。
with
c1 as (select column1 from table where column1 is not null),
c2 as (select column2 from table where column2 is not null),
c3 as (select column3 from table where column3 is not null)
select *
from c1, c2, c3 -- no join condition returns all possible combinations
答案 1 :(得分:0)
使用交叉连接:
DECLARE @t table(col1 int, col2 int, col3 int)
INSERT @t values
(1, null, null),(2, null, null),(3, null, null),
(null, 1, null),(null, 2, null),(null, 3, null),
(null, null, 1),(null, null, 2),(null, null, 3)
SELECT t1.col1, t2.col2, t3.col3
FROM @t t1
CROSS JOIN @t t2
CROSS JOIN @t t3
WHERE t1.col1 is not null and t2.col2 is not null and t3.col3 is not null
答案 2 :(得分:0)
您需要在此处执行Cross Join
。试试这个。
;WITH cte
AS (SELECT 1 cola,NULL colb, NULL colc
UNION
SELECT 2 cola,NULL colb,NULL colc
UNION
SELECT 3 cola,NULL colb,NULL colc
UNION
SELECT NULL cola,1 colb,NULL colc
UNION
SELECT NULL cola,2 colb,NULL colc
UNION
SELECT NULL cola,3 colb,NULL colc
UNION
SELECT NULL cola,NULL colb,1 colc
UNION
SELECT NULL cola,NULL colb,2 colc
UNION
SELECT NULL cola,NULL colb,3 colc)
SELECT *
FROM (SELECT a.cola
FROM cte a
WHERE cola IS NOT NULL) f
CROSS JOIN (SELECT b.colb
FROM cte b
WHERE colb IS NOT NULL) s
CROSS JOIN (SELECT c.colc
FROM cte c
WHERE colc IS NOT NULL) T
答案 3 :(得分:0)
您可以使用两个CROSS JOIN
:
DECLARE @tb AS TABLE
(
column1 INT
,column2 INT
,column3 INT
);
INSERT INTO @tb VALUES (1, NULL, NULL);
INSERT INTO @tb VALUES (2, NULL, NULL);
INSERT INTO @tb VALUES (3, NULL, NULL);
INSERT INTO @tb VALUES (NULL, 1, NULL);
INSERT INTO @tb VALUES (NULL, 2, NULL);
INSERT INTO @tb VALUES (NULL, 3, NULL);
INSERT INTO @tb VALUES (NULL, NULL, 1);
INSERT INTO @tb VALUES (NULL, NULL, 2);
INSERT INTO @tb VALUES (NULL, NULL, 3);
SELECT tb1.column1, tb2.column2, tb3.column3
FROM @tb tb1
CROSS JOIN @tb AS tb2
CROSS JOIN @tb AS tb3
WHERE tb1.column1 IS NOT NULL
AND tb2.column2 IS NOT NULL
AND tb3.column3 IS NOT NULL
ORDER BY tb1.column1, tb2.column2, tb3.column3;