2013-12-19 68 views
3

可以在任何一個可以幫助我解決下面的查詢..如何編寫右外組合JOIN和LEFT OUTER JOIN

在這裏,我們有 1. LEFT OUTER JOIN 2.兩個右外連接

如何既結合右和左辛普森和創建與上述相同的效果,

我需要重寫相同的查詢,這是因爲我是我們的老MS SQL2009轉換成MS SQL2012 ..並在2012年*==*是不支持。

SELECT X.master_key, X.vendor_code 
FROM 
X, Y, X x2 
WHERE Y.master_key = X.parent_key 
AND Y.master_key *= x2.parent_key 
AND x2.INITIALS =* Y.DEFAULT_INITIALS 
AND x2.VENDOR_CODE =* Y.VENDOR_ABBREV 
AND Y.project_name = 'TEST' 

我在上面的代碼如下修改與我的基本知識和沒有在所有

SELECT X.master_key, X.vendor_code 
FROM 
X, 
Y left outer join X x2 
on Y.master_key = x2.parent_key, 

X vnd RIGHT OUTER JOIN Y vnm 
(on vnd.INITIALS = vnm.DEFAULT_INITIALS AND vnd.VENDOR_CODE = vnm.VENDOR_ABBREV) 

WHERE Y.master_key = X.parent_key 
AND Y.project_name = 'TEST' 

的工作,我沒有得到期望的值作爲初始查詢必須做的。

下面是我的全部原始查詢..

SELECT vnd.master_key, vnd.vendor_code 
FROM 
vnd, vnm, vnd vn2 
WHERE vnm.master_key = vnd.parent_key 
AND vnm.master_key *= vn2.parent_key 
AND vn2.INITIALS =* vnm.DEFAULT_INITIALS 
AND vn2.VENDOR_CODE =* vnm.VENDOR_ABBREV 
AND vnm.inactive = 0 
AND vnd.inactive = 0 
AND vnm.project_name = 'TEST' 
ORDER BY 
lower(vnm.company_name + ' '), lower(vnd.vendor_code) ,lower(vnd.first_name + ' '), lower(vnd.last_name + ' ') 

你給的作品,但你可以做上面一個也

SELECT X.master_key, X.vendor_code 
FROM X 
INNER JOIN Y ON X.parent_key = Y.master_key 
LEFT OUTER JOIN X AS x2 ON x2.parent_key = Y.master_key AND x2.INITIALS = Y.DEFAULT_INITIALS AND x2.VENDOR_CODE = Y.VENDOR_ABBREV 
WHERE Y.project_name = 'TEST' 

問候 薩拉薩

+0

你能寫表結構嗎? – Sohail

+0

對不起sohail它保密,這是我改名 – user2045810

+0

我的問題是如何結合LF.OJ和RG.OJ – user2045810

回答

3

嘗試這種解決辦法:

SELECT X.master_key, X.vendor_code 
FROM X 
INNER JOIN Y ON X.parent_key = Y.master_key 
LEFT OUTER JOIN X AS x2 ON x2.parent_key = Y.master_key AND x2.INITIALS = Y.DEFAULT_INITIALS AND x2.VENDOR_CODE = Y.VENDOR_ABBREV 
WHERE Y.project_name = 'TEST' 

你的第二個答案

SELECT vnd.master_key, vnd.vendor_code 
FROM vnd 
INNER JOIN vnm ON vnm.master_key = vnd.parent_key AND vnm.inactive = 0 
LEFT OUTER JOIN vnd vn2 ON vnm.master_key = vn2.parent_key AND vn2.INITIALS = vnm.DEFAULT_INITIALS AND vn2.VENDOR_CODE = vnm.VENDOR_ABBREV 
WHERE vnd.inactive = 0 AND vnm.project_name = 'TEST' 
ORDER BY LOWER(vnm.company_name + ' '), LOWER(vnd.vendor_code) ,LOWER(vnd.first_name + ' '), LOWER(vnd.last_name + ' ') 
+0

非常感謝Saharsh ..你能告訴你如何來到這個querry – user2045810

+0

我看到條件改變的地方,你添加了內部連接並完全刪除了RIGHT OUTER JOIN .. 。 – user2045810

+0

@ user2045810非常歡迎。檢查你已經加入Y和X2表的3條件的查詢條件,並且所有條件都表示從Y表中返回記錄與X2表的匹配記錄。所以我使用了LEFT OUTER JOIN來加入Y和X2表格。 –

2

你並不需要同時LEFTRIGHT加入,因爲外側總是x2

實際上不可能同時加入LEFTRIGHT,如果通過這些表示雙方都是連接謂詞的內部表。但是,如果您有興趣從兩個表中獲取所有行,則始終可以使用FULL JOIN

在此期間,您的查詢可轉換爲以下幾點:

SELECT 
    X.master_key, 
    X.vendor_code 
FROM 
    X 
    INNER JOIN Y 
     ON Y.master_key = X.parent_key 
    LEFT JOIN X x2 
     ON Y.master_key = x2.parent_key 
     AND Y.DEFAULT_INITIALS = x2.INITIALS 
     AND Y.VENDOR_ABBREV = x2.VENDOR_CODE 
WHERE 
    Y.project_name = 'TEST' 
; 

INNER JOIN是兩個表之間的連接正常的結果:只有有符合在兩個表是行包括在結果中。最好使用ANSI風格的連接,而不是繼續將連接條件放在WHERE子句中,即使這是可能的。然後更清楚哪些條件對於這個查詢是唯一的,這些條件是加入表的條件。

LEFTRIGHT一些更多的解釋聯接相關的舊式語法:老樣子,「內在」的一面在每個條件用星號是該側表示。在ANSI連接中,連接語義在級別聲明。這意味着所有連接謂詞必須轉換爲LEFTRIGHT,但不能同時轉換爲兩者。

事實上,LEFTRIGHT連接除了連接順序之間沒有區別。以下兩個查詢中的含義是相同的:

SELECT * 
FROM 
    TableA 
    LEFT JOIN TableB 
     ON A.ID = B.ID 
; 

SELECT * 
FROM 
    TableB 
    RIGHT JOIN TableA 
     ON B.ID = A.ID 
; 

但是,我們一般儘量構建查詢使用LEFT加入,而不是RIGHT加入,因爲它們混合可能會變得非常難以查詢,以瞭解並能很容易弄錯了!

一個小修改到原來的查詢還可以幫助說明爲什麼新的查詢是等效的:

SELECT 
    X.master_key, 
    X.vendor_code 
FROM 
    X, Y, X x2 
WHERE 
    Y.master_key = X.parent_key 
    AND Y.master_key *= x2.parent_key 
    AND Y.DEFAULT_INITIALS *= x2.INITIALS 
    AND Y.VENDOR_ABBREV *= x2.VENDOR_CODE 
    AND Y.project_name = 'TEST' 
; 

注意,現在所有的Y引用左側,和連接全都是LEFT連接。

+0

非常感謝你,它給了一些更好的想法..其實我是java程序員,堅持.. sql,它只是像新鮮 – user2045810