【问题标题】:How to join this query based on condition?如何根据条件加入此查询?
【发布时间】:2016-09-27 08:19:15
【问题描述】:

我有一个如下查询来加入 6 个表。

select     usr.userid,usr.firstName,usr.middleName,usr.lastName,nuser.GRAND_FATHER_NAME,nco    untry.NAME_AR,ncountry.NAME_EN,ncase.START_DATE 
from  User_ usr 
inner join TBL_NAFETHAH_USER nuser 
On nuser.USER_ID = usr.userId 
inner join TBL_NAFETHAH_COUNTRY ncountry 
on nuser.NATIONALITY = ncountry.ID
inner join TBL_NAFETHAH_CASE ncase 
on usr.userId = ncase.inmate_id 
inner join TBL_NAFETHAH_CASE_STATUS ncasestatus 
ON ncase.CASE_STATUS_ID = ncasestatus.CASE_STATUS_ID
and ncasestatus.CASE_STATUS IN (1,2)) 
inner join TBL_NAFETHAH_CASE_STAGE ncasestage 
on ncasestage.CASE_STAGE_ID = ncase.CASE_STAGE_ID                   
inner join TBL_NAFETHAH_USER_IDENTIFICATION uident 
on ( (usr.userId = uident.USER_ID and uident.ID_TYPE = 1) or (usr.userId = uident.USER_ID and uident.ID_TYPE = 2) )   
inner join TBL_NAFETHAH_LOOKUP_VALUE nlookup 
on nlookup.LOOKUP_KEY = uident.ID_TYPE 
and nlookup.CATEGORY_ID = 9
inner join TBL_NAFETHAH_LOOKUP_VALUE nlookup2 
on nlookup2.LOOKUP_KEY = ncasestage.CASE_STAGE 
and nlookup2.CATEGORY_ID = 15
where  nuser.MAKE_PUBLIC = 1

我想在这一行再添加一个条件

         inner join TBL_NAFETHAH_USER_IDENTIFICATION uident on ( (usr.userId = uident.USER_ID and uident.ID_TYPE = 1) or (usr.userId = uident.USER_ID and uident.ID_TYPE = 2) )   

如果这个条件不满足,即空(usr.userId = uident.USER_ID and uident.ID_TYPE = 1) or (usr.userId = uident.USER_ID and uident.ID_TYPE = 2)m 那么我必须添加另一个条件(usr.userId = uident.USER_ID),如果它返回多行只取第一行。

如何实现?

【问题讨论】:

    标签: sql join left-join inner-join


    【解决方案1】:

    如果您想从 TBL_NAFETHAH_USER_IDENTIFICATION 表中省略缺失的记录,那么 INNER JOIN 一个子查询会返回第一个满足条件的记录,并带有有用的ORDER BY

    inner join 
    (
        SELECT TOP(1) * FROM TBL_NAFETHAH_USER_IDENTIFICATION uident 
        WHERE usr.userId = uident.USER_ID  --AND ID_TYPE IN(1, 2)
        ORDER BY ID_TYPE 
    )
    uident ON usr.userId = uident.USER_ID 
    

    如果您想包含 TBL_NAFETHAH_USER_IDENTIFICATION 表中没有匹配项的记录,那么 LEFT OUTER JOIN 一个子查询会返回第一个满足条件且具有有用的ORDER BY的记录。

    left outer join 
    (
        SELECT TOP(1) * FROM TBL_NAFETHAH_USER_IDENTIFICATION uident 
        WHERE usr.userId = uident.USER_ID ID_TYPE IN(1, 2)
        ORDER BY <SomeValue>
     )
     uident ON 1=1
    

    注意:如果每个用户的 TBL_NAFETHAH_USER_IDENTIFICATION 中总是有一条记录,那么您可以按 ID_TYPE 排序并取第一行。如果 1 和 2 是 ID_TYPE 中的前两个值,这将保证如果有 1 或 2 类型,那么它将首先出现。如果您的类型为 0、-1、A、B 等,则必须通过另一个子查询添加虚拟排名列。

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多