获得两列的笛卡尔积

时间:2013-11-12 04:32:46

标签: tsql

如何在一张表中获得两列的笛卡尔积?

我有桌子

A    1
A    2
B    3
B    4

我想要一张新表

A    1
A    2
A    3
A    4
B    1
B    2
B    3
B    4

3 个答案:

答案 0 :(得分:1)

fiddle demo

你的桌子

enter image description here

try this using joins

select  distinct b.let,a.id from [dbo].[cartesian] a join [dbo].[cartesian] b on a.id<>b.id

会产生这样的enter image description here

答案 1 :(得分:0)

创建此表:

CREATE TABLE [dbo].[Table_1]
(
  [A] [int] NOT NULL ,
  [B] [nvarchar](50) NULL ,
  CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [A] ASC )
    WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
           IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
           ALLOW_PAGE_LOCKS = ON ) ON [PRIMARY]
)
ON  [PRIMARY]

像这样填写表格:

INSERT  INTO [dbo].[Table_1]
VALUES  ( 1, 'A' )
INSERT  INTO [dbo].[Table_1]
VALUES  ( 2, 'A' )
INSERT  INTO [dbo].[Table_1]
VALUES  ( 3, 'B' )
INSERT  INTO [dbo].[Table_1]
VALUES  ( 4, 'C' )

SELECT  *
FROM    [dbo].[Table_1]

enter image description here

使用此查询

SELECT DISTINCT
    T1.B ,
    T2.A
FROM    dbo.Table_1 AS T1 ,
    dbo.Table_1 AS T2
ORDER BY T1.B

enter image description here

答案 2 :(得分:0)

为了澄清loup的答案(在评论中允许更详细),任何没有指定相关标准的连接自然会产生笛卡尔积(这就是为什么对你的问题的滑稽回答可能“太容易”了 - 错误地做t1 INNER JOIN t2 ON t1.Key = t1.Key会产生相同的结果)。

但是,SQL Server确实提供了一个明确的选项来让您知道您的意图。 CROSS JOIN基本上就是你要找的东西。但是就像INNER JOIN转换为笛卡尔积而没有有用的连接条件一样,如果您不想在WHERE子句中添加连接条件,CROSS JOIN将转换为简单的内连接。

如果这是一次性操作,可能与您使用的操作无关。但是如果你想为后代说清楚,可以考虑使用CROSS JOIN。