如何获得一张表中两列的笛卡尔积?
我有桌子
A 1
A 2
B 3
B 4
我想要一张新桌子
A 1
A 2
A 3
A 4
B 1
B 2
B 3
B 4
你的桌子
try this using joins
select distinct b.let,a.id from [dbo].[cartesian] a join [dbo].[cartesian] b on a.id<>b.id
会这样
为了澄清 loup 的答案(在评论中允许更详细地说明),任何没有指定相关标准的连接自然会产生笛卡尔积(这就是为什么对您的问题的 glib 答案可能“太容易”了——错误地做 t1 INNER JOIN t2 ON t1.Key = t1.Key 将产生相同的结果)。
但是,SQL Server 确实提供了一个明确的选项来表明您的意图。CROSS JOIN本质上就是您要查找的内容。但是就像 INNER JOIN 在没有有用的连接条件的情况下演变为笛卡尔积一样,如果您不遗余力地在 WHERE 子句中添加连接条件,则 CROSS JOIN 会演变为简单的内部连接。
如果这是一次性操作,那么您使用哪一种可能并不重要。但是,如果您想让后代清楚,请考虑使用 CROSS JOIN。
创建此表:
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