2014-02-11 35 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我知道你并没有真正指定你正在使用的数据库引擎。也许你的数据库引擎不喜欢多个连接条件? –

相关问题