2014-02-11 68 views
0

在此SQL中,它只返回連接表 (subst_Instructions)的col中有數據的行。但是,即使連接中沒有數據,我們也希望它顯示主表中的行。現在,它的'因爲SUBST_INSTRUCTIONS不是空的。 但沒有,它不會顯示該列的數據。有什麼方法可以說SUBST_INSTRUCTIONS不是null和null?sql查詢只顯示在連接中有匹配的行

SELECT * FROM 
(
    SELECT ID_KEY, [BATCH] AS column1, [IMPORTDATE], [DATEBILLED], [RX], 
    [DATEDISPENSED], [DAYSUPPLY], [PAYTYPE], [NPI], 
    [PHYSICIAN], [COST], [QUANTITY], [MEDICATION], A.[NDC], [PATIENTNAME], 
    [ROUTEOFADMIN], [INVOICECAT], [COPAY], [BRAND], [TIER], [SKILLLEVEL], 
    [STAT] STATUS, [LASTTASKDATE],SEQNO,B.[SUBST_INSTRUCTIONS], 
    ROW_NUMBER() OVER(PARTITION BY ID_KEY ORDER BY ID_KEY) rn 
    FROM [PBM].[T_CHARGES] A 
    LEFT OUTER JOIN [OGEN].[NDC_M_FORMULARY] B 
     ON A.[NDC] = B.[NDC] 
    WHERE [STAT] NOT IN (3, 4) 
    AND [TIER] <> 'T1' 
) a 
WHERE SUBST_INSTRUCTIONS IS NOT NULL -- rn = 1 
+0

什麼是外部選擇?當您直接應用WHERE SUBST_INSTRUCTIONS不爲NULL時,結果應該是相同的。 (順便說一句:SUBST_INSTRUCTIONS是表PBM的一個領域,對嗎?在每個領域都有一個限定符A或B會很有幫助。) –

+0

嗨亞當斯,不知何故,你混淆了事物。以任何方式,你不需要WHERE SUBST_INSTRUCTIONS不是NULL。要麼顯示PBM的所有記錄,並顯示BST_INSTRUCTIONS(如果有),請使用外部聯接。或者您只想顯示具有BST_INSTRUCTIONS的PBM記錄,然後使用內部聯接。子句WHERE SUBST_INSTRUCTIONS不是NULL只會有效地使你的外連接成爲一個內連接。 –

+0

我明白了,但這是它工作的唯一途徑。如果我刪除最後一部分,那麼我們只是得到愚蠢。 – Adams

回答

0

請確保在WHERE子句中沒有外部連接表的任何字段。 [STAT]和[TIER]是否都屬於主表?如果它們屬於外連接表,則將條件放在ON子句中,而不是放在WHERE子句中。

+0

他們是主要的。我們只需要從連接表中獲得的就是substitute_instructions。 – Adams

+0

但是,如果B中沒有匹配記錄,則SUBST_INSTRUCTIONS爲空,然後用外部WHERE子句解除外部連接記錄!我不想做的 –

+0

。我們希望通過標準的主表中的每一行。如果有或沒有,我們也想從連接中添加那個小圓點。 – Adams

0

我會使用全外連接而不是左外連接。

+0

我嘗試過外部連接,但它返回完全相同的行。我刪除了'完整的外部聯接',其中SUBST_INSTRUCTIONS不爲空',然後它使重複。 – Adams

0

你是對的 - 將WHERE SUBSR_INSTRUCTIONS IS NOT NULL應用到外部查詢意味着它只會返回連接右側有一行的行,因爲它是連接右側的一列。

它很容易解決這個問題,但通過將此條件移入連接標準來代替。

但是,如果你的數據庫引擎犯規支持多加入你應該加入到一個子查詢,而不是下面

我們也沒有必要的外部查詢的顯示條件。以下是更改的查詢:

SELECT ID_KEY, [BATCH] AS column1, [IMPORTDATE], [DATEBILLED], [RX], 
    [DATEDISPENSED], [DAYSUPPLY], [PAYTYPE], [NPI], 
    [PHYSICIAN], [COST], [QUANTITY], [MEDICATION], A.[NDC], [PATIENTNAME], 
    [ROUTEOFADMIN], [INVOICECAT], [COPAY], [BRAND], [TIER], [SKILLLEVEL], 
    [STAT] STATUS, [LASTTASKDATE],SEQNO,B.[SUBST_INSTRUCTIONS], 
    ROW_NUMBER() OVER(PARTITION BY ID_KEY ORDER BY ID_KEY) rn 
    FROM [PBM].[T_CHARGES] A 
    LEFT OUTER JOIN 
    ( 
     SELECT * FROM [OGEN].[NDC_M_FORMULARY] 
     WHERE [SUBST_INSRUCTIONS] IS NOT NULL -- <--- Note now only applies to 
               --  right hand side. 
    ) B 
    ON A.[NDC] = B.[NDC] 
    WHERE [STAT] NOT IN (3, 4) 
    AND [TIER] <> 'T1' 
+0

我試過這個,但它不喜歡那裏的SUBST_INSTRUCTIONS,但無論如何,事情是,我不想限制數據。我想要傳遞標準的主要所有行,並且我想要連接數據,但我仍然希望所有行,即使它們沒有連接中的數據。 – Adams

+0

無論在連接的右側是否符合條件,您都將在連接條件中指定右側的WHERE時獲取連接左側的所有行。如果這個查詢給你一個錯誤,那麼請發佈錯誤 –

+0

NB我知道你並沒有真正指定你正在使用的數據庫引擎。也許你的數據庫引擎不喜歡多個連接條件? –

相關問題