如果第一次匹配没有行,条件连接如何使用第二次匹配

时间:2016-09-02 05:12:42

标签: sql sql-server tsql

我的客户端表有一些特殊的行以这种方式工作。有多个客户记录属于同一客户,但列值略有不同。这些表属于他们,我不能在他们的表中更改任何内容,所以我必须处理一个脚本来处理这个问题。

现在我需要比较主表中的客户数据并从客户表中获取数据。条件如下:

  1. 如果主表Id存在于客户端表中,则获取与主表Id列匹配的唯一记录

  2. 如果主表Id在客户端表中不存在,请使用主表Idnumber查找并匹配客户端表中的Idnumber。

  3. 下面是我想要实现的一个例子:

    假设这些数据存在于下面的主表和客户端表中:

    enter image description here

    在上面的场景中,我的脚本应始终只选择客户端表PKId 1,并通过匹配主表Id列和客户端表ClientId列来忽略客户端表中的行PKId 2。

    以下是另一种情况:

    enter image description here

    由于行PKId 1具有空ClientId并且无法匹配客户端表中的客户端Id 10,因此我的脚本应该使用主表Idnumber来查找和匹配客户端表中的记录,并且将获取行PKId 2 Idnumber专栏。

    我想在连接条件中做一个案例,但不确定我应该如何构建它。我正在考虑下面的内容(不是实际的SQL语句,只是一些想法):

    Select 
        c.Id, c.Name, c.AuthorizeToken 
    From 
        Client c 
    Left Join 
        Main m on (If m.Id = c.ClientId has data return, get AuthorizeToken from that row only;
     else if m.Id = c.ClientId has no data return, use m.Idnumber = c.Idnumber     
     to find and get AuthorizeToken) 
    

    感谢是否可以就任何替代方案向我提出建议。

3 个答案:

答案 0 :(得分:3)

您也可以使用LEFT JOIN

SELECT m.id, ISNULL(c.authorize_token, c1.authorize_token) authorize_token
FROM main m
LEFT JOIN client c ON m.id = c.client_id
LEFT JOIN client c1 ON m.idnumber = c1.idnumber

答案 1 :(得分:0)

select 
  case when c1.PkID is not null then c1.ID else c2.ID end as ID, 
  case when c1.PkID is not null then c1.Name else c2.Name end as Name,
  case when c1.PkID is not null then c1.AuthorizeToken else c2.AuthorizeToken end as AuthorizeToken

from Main m
   left join Client c1 on c1.ClientID = m.ID
   left join Client c2 on c2.IDNumber = m.IDNumber and c1.ClientID us null

答案 2 :(得分:0)

SELECT m.id, c.name, c.authorize_token
FROM main m, client c
WHERE m.id = c.client_id

UNION ALL

SELECT m.id, c.name, c.authorize_token
FROM main m, client c
WHERE m.idnumber = c.idnumber
and NOT EXISTS ( 
  SELECT c2.client_id from client c2 
  WHERE m.id = c2.client_id )