1

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

我有桌子

A    1
A    2
B    3
B    4

我想要一张新桌子

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

3 回答 3

2

小提琴演示

你的桌子

在此处输入图像描述

try this using joins

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

会这样在此处输入图像描述

于 2013-11-12T05:40:45.253 回答
0

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

但是,SQL Server 确实提供了一个明确的选项来表明您的意图。CROSS JOIN本质上就是您要查找的内容。但是就像 INNER JOIN 在没有有用的连接条件的情况下演变为笛卡尔积一样,如果您不遗余力地在 WHERE 子句中添加连接条件,则 CROSS JOIN 会演变为简单的内部连接。

如果这是一次性操作,那么您使用哪一种可能并不重要。但是,如果您想让后代清楚,请考虑使用 CROSS JOIN。

于 2013-11-12T05:12:56.733 回答
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

在此处输入图像描述

于 2013-11-12T05:01:44.363 回答