2015-03-31 246 views
-1

我正在處理這個查詢,只是不知道如何在3個不同的表上使用內部聯接,其中一個表只與其他2個錶鏈接。Sql內部聯接查詢

個別查詢做工精細:

SELECT sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
FROM cctvpcn_batches,statutory_letter 
WHERE sl_system_ref = 1095278 and sl_letter_batch = cctvpcn_batch 
ORDER BY cctvpcn_run_date 

SELECT sl_letter_batch,nto_run_date,nto_post_date 
FROM nto_batches,statutory_letter 
WHERE sl_system_ref = 1095278 and sl_letter_batch = nto_batch 
ORDER BY nto_run_date 

現在,如果我想內部連接相同的表:

SELECT sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
FROM cctvpcn_batches,statutory_letter 
    INNER JOIN nto_batches,statutory_letter and sl_letter_batch = nto_batch 
and sl_letter_batch = cctvpcn_batch 
WHERE sl_system_ref = 1095278 
ORDER BY nto_run_date 

我知道這只是嘗試一些不同的語法錯誤。 由於sl_letter_batch在兩個表中具有不同的值。我得到的結果是空的。

sl_letter_batch cctvpcn_run_date cctvpcn_post_date 
21326 2014-10-07 12:45:06.000 2014-10-07 00:00:00.000 
21571 2014-11-25 14:13:55.000 2014-11-25 00:00:00.000 

sl_letter_batch nto_run_date nto_post_date 
21502 2014-11-13 09:06:24.000 2014-11-13 00:00:00.000 
21785 2015-01-05 14:30:42.000 2015-01-05 00:00:00.000 

有無論如何寫這個查詢來獲得兩個表結果加入。

+0

哪些DBMS是你使用? Postgres的?甲骨文? – 2015-03-31 16:36:49

+0

SQL服務器mgmt工作室 – pretyv5 2015-03-31 16:41:08

+0

可能重複[SQL內部連接3表?](http://stackoverflow.com/questions/10195451/sql-inner-join-with-3-tables) – 2015-03-31 19:20:28

回答

0

這裏混合2 sql樣式 - 新舊。在老 - 使用語法‘JOIN表名ON ID1 = ID2 ......’ - - 使用「」

.. FROM cctvpcn_batches, statutory_letter WHERE ... 
在新

2個表連接只在這裏每一個表的‘加盟’,每個‘JOIN’字應該有匹配「開」。

SELECT ... 
FROM cctvpcn_batches 
INNER JOIN statutory_letter 
     ON sl_letter_batch = cctvpcn_batch 
INNER JOIN nto_batches 
     ON sl_letter_batch = nto_batch 
WHERE ... 

您仍然可以組合樣式。

SELECT ... 
FROM cctvpcn_batches, statutory_letter 
INNER JOIN nto_batches 
     ON sl_letter_batch = nto_batch 
WHERE sl_letter_batch = cctvpcn_batch 
     ... 

對 「加入... ON ...」 可以奧斯陸被用作支架:

SELECT ... 
FROM cctvpcn_batches 
INNER JOIN nto_batches 
    INNER JOIN statutory_letter 
    ON sl_letter_batch = cctvpcn_batch 
ON sl_letter_batch = nto_batch 
WHERE ... 

我們在這裏參加 「nto_batches」,但在這樣做之前加入 「statutory_letter」 到 「cctvpcn_batches」 。這就是爲什麼有兩個連續的 「ON」 - 首先是 「statutory_letter」,第二個 - 對 「nto_batches」

,如果你需要OUTER連接(包括不匹配),則:

SELECT ... 
FROM statutory_letter 
LEFT OUTER JOIN cctvpcn_batches 
     ON sl_letter_batch = cctvpcn_batch 
LEFT OUTER JOIN nto_batches 
     ON sl_letter_batch = nto_batch 
WHERE ... 
+0

謝謝parfilko ..左外連接解決了我的問題.... – pretyv5 2015-04-01 07:40:36

0

嘗試這樣的:

select sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
from cctvpcn_batches inner join statutory_letter on sl_letter_batch = cctvpcn_batch 
inner join nto_batches on sl_letter_batch = nto_batch 
where sl_system_ref = 1095278 
order by nto_run_date 

編輯:

你需要有與您可以加入你的表列。這樣的事情:

select sl_letter_batch,cctvpcn_run_date,cctvpcn_post_date 
from cctvpcn_batches c inner join statutory_letters s on c.id= s.id 
inner join nto_batches n on s.id= n.id 
where s.sl_system_ref = 1095278 
order by n.nto_run_date 
+0

拉胡爾,這就是我什麼提到sl_letter_batch具有不同的值,如果你看到我的結果,它將結果爲空值。 – pretyv5 2015-03-31 16:35:20

+0

@ pretyv5: - 你有任何id列可以加入兩張表嗎? – 2015-03-31 16:35:56

+0

statutory_letter表對於兩個表都是常見的,sl_letter是兩個表的id列。我不知道這是一個愚蠢的問題,或者我想到了... – pretyv5 2015-03-31 16:40:09