2017-03-06 74 views
0

我需要從sql數據庫中的2個表中選擇所有數據。 我搜索了網站,幹了很多方式,但沒有成功。 一張桌子沒有數據,但另一張已滿。 如果我單獨選擇每一個我得到了良好的效果,但如果我使用例如:sql查詢錯誤沒有數據顯示

select * from relatorio cross join temp 

select * from relatorio r,temp t 

甚至:

select t.*, r.* from temp t inner join relatorio r on 1=1 

的參加作品,但沒有其中顯示數據。

誰能幫助? 在此先感謝。

+1

試試'LEFT JOIN' – HoneyBadger

+0

@HoneyBadger聽起來更像是一個'FULL JOIN'。雖然我不明白只是盲目執行表格之間的笛卡爾積 – Lamak

+0

^^^正確。 INNER JOIN不起作用,因爲它只會返回包含在兩個表中的數據。 –

回答

2

的問題全部三個select語句是交叉連接。 僅當兩個表至少有一行時,交叉連接才返回數據。 它返回兩個表的笛卡爾乘積,這意味着一個表中的每一行都將連接到另一個表中的每一行。

一個表沒有數據,但另一個表已滿。

由於其中一個表爲空,它將根本不返回任何結果。你可以把它看作是以0爲單位的乘法。

現在,你有兩種選擇:一種是使用一個完整的加盟,另一種是用左連接,在這種情況下都將返回相同的結果,因爲一個表是空的:

select * 
from relatorio 
left join temp on <join condition> -- assuming temp is the empty table 

select * 
from relatorio 
full join temp on <join condition> -- in this case, it doesn't matter what table is empty 
+0

令人驚歎的,就是這樣。 我使用了第二個選項。 謝謝 – septaug

1

如果要返回所有匹配和不匹配的行,請使用Full Outer Join。FULL OUTER JOIN關鍵字返回左表(table1)和右表(table2)中的所有行。

FULL OUTER JOIN關鍵字結合了LEFT和RIGHT連接的結果。

在SQL中,FULL OUTER JOIN結合了左外連接和右外連接的結果,並從join子句兩邊的表中返回所有(匹配或不匹配)行。

SQL FULL OUTER JOIN語法

SELECT column_name(s) 
FROM table1 
FULL OUTER JOIN table2 
ON table1.column_name=table2.column_name; 

的SQL CROSS JOIN產生一個結果集,它是行中的第一個表,如果沒有WHERE在第二個表乘以行數的數子句與CROSS JOIN一起使用。這種結果被稱爲笛卡兒積(Cartesian Product)。

如果WHERE子句與CROSS JOIN一起使用,則其功能類似於INNER JOIN。

實現相同結果的一種替代方法是在SELECT之後使用以逗號分隔的列名,並在FROM子句之後提及涉及的表名。

CROSS JOIN語法

SELECT * 
FROM table1 
CROSS JOIN table2;