如何在一张表中获得两列的笛卡尔积?
我有桌子
A 1
A 2
B 3
B 4
我想要一张新表
A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4
答案 0 :(得分:1)
你的桌子
try this using joins
select distinct b.let,a.id from [dbo].[cartesian] a join [dbo].[cartesian] b on a.id<>b.id
会产生这样的
答案 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]
使用此查询
SELECT DISTINCT
T1.B ,
T2.A
FROM dbo.Table_1 AS T1 ,
dbo.Table_1 AS T2
ORDER BY T1.B
答案 2 :(得分:0)
为了澄清loup的答案(在评论中允许更详细),任何没有指定相关标准的连接自然会产生笛卡尔积(这就是为什么对你的问题的滑稽回答可能“太容易”了 - 错误地做t1 INNER JOIN t2 ON t1.Key = t1.Key会产生相同的结果)。
但是,SQL Server确实提供了一个明确的选项来让您知道您的意图。 CROSS JOIN基本上就是你要找的东西。但是就像INNER JOIN转换为笛卡尔积而没有有用的连接条件一样,如果您不想在WHERE子句中添加连接条件,CROSS JOIN将转换为简单的内连接。
如果这是一次性操作,可能与您使用的操作无关。但是如果你想为后代说清楚,可以考虑使用CROSS JOIN。