簡體   English   中英

完全外聯或聯盟?

[英]FULL OUTER JOIN or UNION?

困惑如何實現這一點可能與FULL OUTER或UNION。 我想以這樣的方式加入結果

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 

您需要笛卡爾產品加入或交叉加入..

SELECT 
  *
FROM
  table1, table2

要么

SELECT
  * 
FROM 
  table1 CROSS JOIN table2

(參考: http//publib.boulder.ibm.com/iseries/v5r2/ic2924/index.htm?info / sqlp / rbafymstcrojo.htm

如果db2有它,請使用cross join

您可能想要重新考慮您的數據庫命名標准 - 將列命名為“ID”,但允許重復不是一個好主意恕我直言。

由於重復,不太清楚需要什么,但假設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 

正如其他答案所說,如果你想要Table2中的所有行表2中的所有行,那么交叉連接(即笛卡爾連接)就是答案。

另一方面,在上面的場景中,ID上的內部聯接也將返回相同的結果集:

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

使用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也是笛卡爾積。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM