2017-02-27 238 views
0

我知道這個問題已經被問了好幾次,但是它並沒有解決我的問題。通過從三個表格中提取數據創建視圖

我有三張表,JD,LYR和VC,三者都有不同的架構。我想創建一個視圖,從這三個表中提取數據,這樣就會有JD和LYR以及LYR和VC中存在的記錄。所以,我認爲JD/LYR和LYR/VC應該有內在聯繫。我不想加入JD和VC。

我寫了sql,但是,如果它顯示出現在JD和LYR中的記錄,那麼它將不會顯示LYR和VC之間的匹配記錄,反之亦然。我目前的SQL如下。

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VC.ACCOUNT_STATUS, 
     VC.ACCOUNT_NUMBER 
FROM JD 
INNER JOIN LYR 
    ON (JD.REQ_ID = LYR.REQ_ID) 
INNER JOIN VC 
    ON LYR.REQ_ID = VC.REQUEST_ID; 

我想,改變了連接類型的其他加入像左外等,但並沒有work.Any幫助將關於SQL這一觀點可以理解的。

在此先感謝, KB。

+0

您選擇JD,LYR和vcase列,從JD,LYR和VC ... – jarlh

+0

添加一些示例表數據和預期的結果 - 以及格式化文本。 – jarlh

+0

請編輯您的問題,以包括樣本數據和預期的輸出... – JohnHC

回答

0

試試這個:根據你的描述你在LYR的所有記錄,這兩個表JD & VC從該表中有一些共享的數據。但JD & VC可能會或可能不會有相同的數據,因此在這種情況下,你所要做的LEFT JOINLYR爲主要表下面給出:

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
LEFT JOIN JD ON JD.REQ_ID = LYR.REQ_ID 
LEFT JOIN VC ON LYR.REQ_ID = VC.REQUEST_ID; 
+0

謝謝你們的快速幫助。我遵循Suraz的建議,似乎它正在工作,稍後我會做更多的檢查。 –

+0

這是否會避免在LYR中選擇沒有JD或VC中沒有匹配行的行? –

0

你可以試試下面:

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT * FROM (SELECT JD.REQ_ID,JD.REF_NO,LYR.OID_VAL,VCASE.ACCOUNT_STATUS,VCASE.ACCOUNT_NUMBER 
FROM JD INNER JOIN LYR ON (JD.REQ_ID = LYR.REQ_ID)) a INNER JOIN VC 
ON a.REQ_ID = VC.REQUEST_ID; 
0

當前的SQL將顯示的記錄只有在數據存在於所有三個表。這聽起來像你想要的SQL將顯示數據目前在某些類型的外部連接。

第一個版本是將查詢寫爲UNION而不是JOIN(即兩個查詢中只有一個內連接,而它們之間有一個UNION ALL)。這將是保證正確性。

從那裏你可能可以創建一些使用外部連接的地方,以及哪些條件可能表現更好,但通常最好是首先確保正確性。

0

由於您的查詢內連接所有三個表,它將只顯示在所有三個表中匹配數據的記錄。據我瞭解,你想記錄顯示LYRJD匹配的數據在LYRVC(或全部三個)匹配的數據。

我不知道的一個辦法直接做到這一點使用連接,所以我會離開,加入有附加條件他們:

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
LEFT JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID) 
LEFT JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
WHERE JD.REQ_ID IS NOT NULL OR VC.REQUEST_ID IS NOT NULL; 

另一種可能的方法是使用UNION(和UNION ALL):

CREATE OR REPLACE VIEW TEST_VIEW AS 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
INNER JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID) 
LEFT JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
UNION 
SELECT JD.REQ_ID, 
     JD.REF_NO, 
     LYR.OID_VAL, 
     VCASE.ACCOUNT_STATUS, 
     VCASE.ACCOUNT_NUMBER 
FROM LYR 
INNER JOIN VC 
    ON (LYR.REQ_ID = VC.REQUEST_ID) 
LEFT JOIN JD 
    ON (LYR.REQ_ID = JD.REQ_ID); 
+0

謝謝Jiri Tousek的幫助。申請它。你的sql也起作用了,由於union,它只是更多的SQL,並且我在這三個表中都有大量的字段,所以它將是巨大的代碼。再次感謝。 –

相關問題