此sql查询不返回连接表中的所有数据

时间:2014-02-10 22:32:14

标签: sql

在这个sql中,我们正在从处方集表中寻找subst_instructions。我们只得到其中的一个或两个,即使第一个表中应该有其他人使用相同的med:

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 rn = 1

以下是最终起作用的查询:

select * from (SELECT ID_KEY, [BATCH] AS column1, [IMPORTDATE], [DATEBILLED], [RX], />    [DATEDISPENSED], [DAYSUPPLY], [PAYTYPE], [NPI],
 [PHYSICIAN], [COST], [QUANTITY], [MEDICATION], A.[NDC], [PATIENTNAME], [ROUTEOFADMIN], <br>  [INVOICECAT], [COPAY], [BRAND], [TIER], [SKILLLEVEL], <br>  
 [STAT] STATUS, [LASTTASKDATE],SEQNO,B.[SUBST_INSTRUCTIONS],<br>   row_number() over(partition by ID_KEY order by ID_KEY) rn FROM [PBM].[T_CHARGES] A<br>  
  LEFT OUTER JOIN [OGEN].[NDC_M_FORMULARY] B ON A.[NDC] = B.[NDC]  Where [STAT] not in <br>  (3, 4) AND [TIER] <> 'T1'  )a where SUBST_INSTRUCTIONS is not null -- rn = 1

3 个答案:

答案 0 :(得分:1)

where rn = 1将会受到限制,如果你在没有它的情况下运行查询,结果看起来更像你期望的吗?

答案 1 :(得分:0)

这是您的查询格式稍微好一些:

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 rn = 1;

没有迹象表明stattier来自哪里。我猜他们中的一个或多个来自ndc_m_formulary表。如果我必须选择一个,我猜是tier。在任何情况下,来自“b”表的任何内容都应该在on子句中,而不是where子句中。此比较是撤消left outer join并将其转换为常规inner join

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]  AND [TIER] <> 'T1'
     Where [STAT] not in (3, 4)
    ) a
where rn = 1;

良好的格式化以及所有列引用的表别名的使用实际上将帮助您编写可以更快地正常工作的SQL代码。

答案 2 :(得分:0)

有时候Null可以隐藏你想要的数据。

e.g。

  CREATE TABLE #STAT (
   ID INT IDENTITY(1,1),
   STAT INT NULL )

   INSERT INTO #STAT (STAT)
   SELECT 3 UNION ALL
   SELECT NULL UNION ALL
   SELECT 4 UNION ALL 
   SELECT 5 

   SELECT * FROM #STAT

   SELECT * FROM #STAT WHERE [STAT] NOT IN (3,4) 

要解决此问题,请使用COALESCE

SELECT * FROM #STAT WHERE COALESCE([STAT],0) NOT IN (3,4)