2017-04-13 73 views
1

我想結合內部和外部連接,但無法讓它工作。我一共有7個表需要在一個查詢中連接在一起。 首先,我只有6人,並沒有問題,因爲一切都是內部聯接。但是現在我已經添加了第七張桌子,並且無法正確完成。我想我需要使用OUTER JOIN,但不知道如何。 我只會在這個例子中使用3個表格,因爲我認爲如果你能幫助我開始,我可以設法解決其餘問題。加入幾個表與內部和外部。

列表我的表:

表1 = dbo.kala(這是第七表我加入

表2 = dbo.ti

表3 = dbo.ao

SELECT kala.kaldat 
From dbo.kala 
Where kala.kaldat Between '170407' AND '170410' 

以上查詢返回以下結果:

Result1 
|kaldat | 
|2017-04-07| 
|2017-04-08| 
|2017-04-09| 
|2017-04-10| 

SELECT ti.startdat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr 
From dbo.ti 
INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos 
Where ti.startdat Between '170407' AND '170410' 

上述查詢返回以下結果。

Result2 
ti.startdat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr| 
2017-04-07 | 123  | 0001 |10  |50  | 
2017-04-10 | 456  | 0002 |20  |60  | 

我想要的結果是這(3)。

Result3 
kala.kaldat| ti.artnr| ti.aonr|ti.aopos|ao.prodgr| 
2017-04-07 | 123  | 0001 |10  |50  | 
2017-04-08 |   |  |  |   | 
2017-04-09 |   |  |  |   | 
2017-04-10 | 456  | 0002 |20  |60  | 

dbo.kala和dbo.ti之間的連接在kala.kaldat = ti.startdat上。

希望你們明白我想要通過這裏。如果不是,我事先道歉,並樂意嘗試解釋更好。提前致謝!

*請注意,其餘4個不在此示例中的表需要與dbo.ti連接(INNER?)。

+0

左連接是你所追求的,但是如果你有任何where子句條件涉及到「左」連接的「右」表上的表,那麼它需要放在連接上或者你的左連接模擬一個內連接。 – xQbert

+0

您正嘗試選擇3個表中沒有索引的數據,因爲您需要使用左連接或完全外連接,具體取決於您想要獲取的內容--->請參見https://i.stack。 imgur.com/66zgg.png –

+0

我確實有更多的地方連接到dbo.ti的子句...我需要的所有從dbo.kala是日期列表。然後我希望剩下的表格只填寫正確日期的信息。 – SisU

回答

1

選擇日期從kala,然後外部聯接ti,則外連接ao

SELECT kala.kaldat, ti.artnr, ti.aonr, ti.aopos, ao.prodgr 
FROM dbo.kala 
LEFT JOIN dbo.ti ON kala.kaldat = ti.startdat 
LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos 
WHERE kala.kaldat BETWEEN '20170407' AND '20170410'; 

(您必須外連接ao也是如此,因爲如果ti記錄外連,那麼它的aonraopos爲空。如果你加入內ao,你會得到不匹配,因此丟棄)

+0

太棒了!謝謝。 – SisU

2

INNER JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos

你想達到什麼要求使用

LEFT JOIN dbo.ao ON ti.aonr = ao.aonr AND ti.aopos = ao.aopos

+0

謝謝,但你還沒有使用表「卡拉」呢? – SisU

+0

那麼,您可以自己添加這些表格,以便爲查詢添加另一個JOIN。您只需添加另一個連接: 'LEFT JOIN table2 t2 ON t1.id = t2.id LEFT JOIN table3 t3 ON t1.id = t3.id' 等等等等。 – schroedingersKat