ПОЛНОЕ НАРУШЕНИЕ или СОЮЗ? - PullRequest
3 голосов
/ 28 июля 2010

перепутал, как этого добиться, может быть, с ПОЛНЫМ ВНЕШНИМ или СОЮЗОМ.Я хочу объединить результаты таким образом, чтобы

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 

Ответы [ 5 ]

10 голосов
/ 28 июля 2010

Вам нужно объединение декартовых произведений или Cross Join ..

SELECT 
  *
FROM
  table1, table2

или

SELECT
  * 
FROM 
  table1 CROSS JOIN table2

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

3 голосов
/ 28 июля 2010

используйте cross join, если у db2 есть

2 голосов
/ 28 июля 2010

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

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

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

OR

select t1.ID, t1.Name, t1.Salary, t2.Fruit 
from Table1 t1 CROSS JOIN Table2 t2 
1 голос
/ 28 июля 2010

Используйте 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 также является декартовым произведением.

1 голос
/ 28 июля 2010

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

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

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

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...