2013-11-12 4 views
-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 
+0

что вы пробовали? – Hariharan

+0

Что вам нужно, это * self-join *, что означает, что вы присоединяетесь к таблице для себя. – Gabe

ответ

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

0

Чтобы уточнить ответ Loup (в более подробно, что допустимо в комментарии), любой присоединиться не соответствующих критериям, указанным естественным образом произвести декартово произведение (вот почему ответ glib на ваш вопрос может быть «слишком легко» - ошибочно делать t1 INNER JOIN t2 ON t1.Key = t1.Key даст тот же результат).

Однако SQL Server предлагает явный вариант, чтобы ваши намерения были известны. CROSS JOIN - это, по сути, то, что вы ищете. Но, как INNER JOIN, превращаясь в декартово произведение без полезного условия соединения, CROSS JOIN переходит к простому внутреннему соединению, если вы избегаете добавлять критерии присоединения в предложение WHERE.

Если это одноразовая операция, вероятно, не имеет значения, что вы используете. Но если вы хотите дать понять, для потомков, рассмотрите CROSS JOIN.

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

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

спасибо, что сказал мне, я сделал изменения @MarcoForberg –

Смежные вопросы