首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL IN和NOT IN

TSQL IN和NOT IN
EN

Stack Overflow用户
提问于 2018-01-08 18:08:46
回答 2查看 1.2K关注 0票数 0

我有下面的查询,它返回没有'-829‘值的所有诊断。查询确实可以工作,但我认为我让它变得更难了。有没有更整洁的方法呢?

代码语言:javascript
复制
select distinct
c2.diagnosisn DiagnosisName, 
a2.text CareLookup
from core_patdiagnosis c1 
LEFT OUTER JOIN core_diagnosis c2 ON c1.diagnosis = c2.id 
LEFT OUTER JOIN core_carecontext c3 ON c1.carecontex = c3.id 
LEFT OUTER JOIN applookup_instance a1 ON c1.lkp_specialty = a1.id 
LEFT OUTER JOIN core_diagnosis_taxonomyma c5 ON c2.id = c5.id 
LEFT OUTER JOIN applookup_instance a3 ON c5.lkp_taxonomyna = a3.id 
LEFT OUTER JOIN applookup_instance a2 ON c3.lkp_context = a2.id

where c2.id IN
(
select c11.id core_diagnosis_c1_id
from core_diagnosis c11 
LEFT OUTER JOIN core_diagnosis_taxonomyma c21 ON c11.id = c21.id 
LEFT OUTER JOIN applookup_instance a11 ON c21.lkp_taxonomyna = a11.id
WHERE
c11.isactive = 1
and a11.id != -829 or a11.id is null
)

AND
c2.id NOT IN
(
select c12.id ProcID
from core_procedure c12
LEFT OUTER JOIN core_procedure_taxonomyma c22 ON c12.id = c22.id 
LEFT OUTER JOIN applookup_instance a12 ON c22.lkp_taxonomyna = a12.id
WHERE
c12.isactive = 1
and a12.id = -829 or a12.id is null
)

AND
c1.sys_creation_datetime > '01 Dec 2017 00:00:00' AND a2.text like 
'%Emergency%'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-08 22:02:48

未使用的额外内容

a2.text这样的文本会中断外部连接

代码语言:javascript
复制
select distinct c2.diagnosisn DiagnosisName, a2.text CareLookup
from core_patdiagnosis  c1 
JOIN core_diagnosis     c2 ON c2.id = c1.diagnosis  
JOIN core_carecontext   c3 ON c3.id = c1.carecontex 
JOIN applookup_instance a2 ON a2.id = c3.lkp_context     

where c2.id IN
( select c11.id 
  from core_diagnosis c11 
  LEFT OUTER JOIN core_diagnosis_taxonomyma c21 ON c11.id = c21.id 
  LEFT OUTER JOIN applookup_instance a11        ON c21.lkp_taxonomyna = a11.id
  WHERE c11.isactive = 1 and a11.id != -829 
     or a11.id is null
)

AND
c2.id NOT IN
( select c12.id 
  from core_procedure c12
  LEFT OUTER JOIN core_procedure_taxonomyma c22 ON c12.id = c22.id 
  LEFT OUTER JOIN applookup_instance a12        ON c22.lkp_taxonomyna = a12.id
  WHERE c12.isactive = 1 and a12.id = -829 
     or a12.id is null
)

AND c1.sys_creation_datetime > '01 Dec 2017 00:00:00' 

AND a2.text like '%Emergency%'
票数 0
EN

Stack Overflow用户

发布于 2018-01-08 20:07:44

您可以使用CTE (公用表表达式- see msdn page

WITH BufferTableCTE (id) AS (...) SELECT ... FROM ... WHERE id in (SELECT id FROM BufferTableCTE WHERE id != -829) AND NOT id in (SELECT id FROM BufferTableCTE WHERE id = -829) AND ...

另一种方法是将中间结果存储在临时表中,然后在以后使用这个临时表(两次,一次使用id != -829,另一次使用id = 829)

这两种方法都可以减少重复的sql声明。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48148074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档