在这个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
答案 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;
没有迹象表明stat
和tier
来自哪里。我猜他们中的一个或多个来自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)