将SQL Server中的行与所有其他行组合在一起

时间:2015-02-19 09:23:16

标签: sql sql-server

说我有这样一张桌子:

enter image description here

我想创建一个select,它将每个非null行与其他所有值组合在一起,以便最终得到:

enter image description here

等,一直到3 - 3 - 3

这可以在一个选择语句中完成吗?

4 个答案:

答案 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;