2010-07-28 5 views
2

смущенный, как достичь этого, возможно, с ПОЛНЫМ ВЗГЛЯДОМ или СОЮЗОМ. Я хочу присоединиться к результатам таким образом, чтоПОЛНАЯ ВНУТРЕННЯЯ СОЕДИНЕННОСТЬ ИЛИ СОЮЗ?

Table1      Table2 
---------------   ----------------- 
ID Name Salary   ID Fruits 
---------------   ----------------- 
1 John 1000   1  Apples 
1 Henry 4000   1  Mangoes 
1 Smith 1000   1  Tomatoes 

Результат должен быть

ResultTable 
     ------------------------ 
     ID Name Salary Fruits 
     ----------------------- 
     1 John 1000 Apples 
     1 John 1000 Mangoes 
     1 John 1000 Tomatoes 
     1 Henry 4000 Apples 
     1 Henry 4000 Mangoes 
     1 Henry 4000 Tomatoes 
     1 Smith 1000 Apples 
     1 Smith 1000 Mangoes 
     1 Smith 1000 Tomatoes 
+4

Вы, очевидно, ошибаетесь. Правильно? –

+0

Имеет ли db2 крест? – garik

ответ

9

Вам нужно декартово произведение присоединиться или Cross .. Присоединяйтесь

SELECT 
    * 
FROM 
    table1, table2 

или

SELECT 
    * 
FROM 
    table1 CROSS JOIN table2 

(ссылка: http://publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info/sqlp/rbafymstcrojo.htm)

+0

+1 Вы отредактировали свой ответ после того, как увидели мое, или мы просто пишем почти то же самое в одно и то же время? –

+0

@Mark, lol .. я googled для конкретного ответа db2, и ссылка, которую я нашел, цитирует тот же текст и получил его оттуда .. * hehe * –

+0

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

3

использование cross join если db2 имеет его

2

Вы можете захотеть пересмотреть свои стандарты именования DB - присвоения имен столбцов, как «ID», но затем позволяя дубликаты не отличная идея, ИМХО.

Из-за дублирования, то не совсем понятно, что требуется, но при условии, что идентификатор является отвлекающим маневром, я думаю, что CROSS JOIN правильный подход в вашем сценарии

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1, Table2 t2 

ИЛИ

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1 CROSS JOIN Table2 t2 
+0

Да, я знаю о дублировании, его просто ситуация в оригинальных таблицах немного сложна. –

1

Как уже говорилось в других ответах, если вы хотите, чтобы все строки в таблице 1 для всех строк в таблице2, то ответ на перекрестное соединение (т. Е. Декартовое соединение).

С другой стороны, в приведенном выше сценарии, внутреннее соединение по ID будет также возвращать один и тот же набор результатов:

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1 join Table2 t2 on t1.id = t2.id 

Опять же, если этот запрос относится к той же проблеме, как некоторые из ваших кристаллических вопросов вы могли бы найти это более полезный ResultSet:

ResultTable

------------------------ 
    ID Name Salary Fruits 
    ----------------------- 
    1 John 1000  
    1 Henry 4000  
    1 Smith 1000  
    1    Apples 
    1    Mangoes 
    1    Tomatoes 

, которые могут быть получены с этим запросом:

select ID, Name, Salary, '' Fruit from Table1 union all 
select ID, '' Name, NULL Salary, Fruit from Table2 
1

Используйте CROSS JOIN:

SELECT T1.Name, T1.Salary, T2.Fruit 
    FROM Table1 AS T1 
     CROSS JOIN Table2 AS T2; 

Избегайте использование инфиксального обозначения:

SELECT T1.Name, T1.Salary, T2.Fruit 
    FROM Table1 AS T1, Table2 AS T2; 

Я не совсем уверен, почему, но фольклорная определенно не нравится инфиксальное обозначение, особенно когда вы добавьте предложение WHERE. Они скажут вам, что CROSS JOIN - это SQL-92, что действительно правильно, но затем добавлена ​​нотация SQL-92.

О, и некоторые люди называют переписанную нотацию без предложения WHERE. Декартовой продукт, который действительно правильный, но затем CROSS JOIN является декартовым продуктом.

+0

Хейя, спасибо за комментарий onedaywhen. Что вы понимаете под инфиксной нотацией? И как он отличается от креста? –

+0

@Popo: infix notation - это термин, заданный конструкцией, где табличные выражения разделены запятой без явных условий 'JOIN', например. 'FROM Table1, Table2;' Кросс-соединение отличается от того, что выражения таблицы не разделены запятыми и имеют условия CROSS JOIN, например. 'FROM Table1 CROSS JOIN Table2;' – onedaywhen

+0

Примером инфиксной нотации является 'SELECT * T1 CROSS JOIN T2' - я полностью изменил этот ответ и комментарий. О чем я только думал?! – onedaywhen

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