如果行不存在,则从表中选择默认值

时间:2014-11-10 03:29:44

标签: sql-server

我有两张桌子 - 表记录包含列ID,代码,ProviderId 包含Code,Number,ProviderId

列的表代码

样本数据:

表记录

 ID             Code         ProviderId
 1              ABC           1 
 2              DEF           2
 3              XYZ           1
 4              PQR           2

表格代码

 Code       Number     ProviderId
 ABC        1111        1
 Default    9999        1 
 XYZ        2222        2
 Default    4444       2

记录表格中的所有行都会有代码。 代码表将包含一组使用其他信息定义的代码。 Record表中的所有代码都不必在Codes表中有一个条目。对于Code in Records表中,如果存在相应的值,则选择相同的else,需要根据ProviderID列选择Default code。

我的预期结果是:

ID      Code     Number
-------------------------
1       ABC      1111
2       DEF      9999 -> Picked up the default for ProviderId 1
3       XYZ      2222
4       PQR      4444 -. Picked up the default for ProviderId 2

我能够使用左外连接将记录添加到表变量中,然后再次执行内连接。 我想知道我是否可以在一个选择中实现这一目标。

4 个答案:

答案 0 :(得分:2)

您可以使用left join s执行此操作:

select r.id, r.code, coalesce(c.number, cd.number) as number:
from records r left join
     codes c
     on r.code = c.code left join
     codes cd
     on r.providerid = c.providerid and c.code = 'Default';

即,查找两个值。如果匹配,请根据code选择一个;否则,请使用默认值。

答案 1 :(得分:0)

我认为,你的'DEF'或'PQR'条目是错误的,更应该是“Providerid”是1.我从你的数据准备一个样本。

使用@Gordon的一些代码。但逻辑是不同的。

declare @records table(id int, code varchar(50), providerid int)
declare @code table(code varchar(50), number int, providerid int)

insert into @records values (1,'ABC',1), (2,'DEF',2),(3,'XYZ',1),(4,'PQR',2)

insert into @code values ('ABC',1111,1 ), ('DEFAULT',9999, 1) , ('XYZ',2222,2) , ('Default', 4444, 2)

--your data in wrongly entered , that why the 'DEF' show the wrong thing below.
select 
    id, r.code ,
     case 
        when ISNULL(c.code , '') = '' 
        then c1.number
        else c.number
    end
from 
    @records r
    left outer join @code c on r.code = c.code
    left outer join @code c1 on r.providerid = c1.providerid and LOWER( c1.code) = 'default'

--if the default entry is multiple times, then good to use sub-query with top   
select 
    id, r.code ,
    case 
        when ISNULL(c.code , '') = '' 
        then ( select top 1 number from @code c1 where r.providerid = c1.providerid and LOWER( c1.code) = 'default' )
        else c.number
    end
from 
    @records r
    left outer join @code c on r.code = c.code

答案 2 :(得分:0)

试试这个..正如其他人所提到的'PQR'输入错误。它不应该是'9999'。它应该是'4444'

SELECT a.ID,b.Code,b.Number
FROM   Records a
       JOIN code b
         ON a.Code = b.Code
UNION ALL
SELECT a.ID,a.Code,b.Number
FROM   Records  a
       JOIN code b
         ON a.ProviderId = b.ProviderId
WHERE  NOT EXISTS(SELECT 1
                  FROM   Code aa
                  WHERE  aa.Code = a.Code)
       AND b.Code = 'default' 

答案 3 :(得分:0)

SELECT A.ID,A.Code,B.Number,A.ProviderId
FROM   #Source A
JOIN   #Code B ON A.Code = B.Code
UNION
(SELECT A.ID,A.Code,B.Number,A.ProviderId
FROM   #Source A
JOIN   #Code B ON A.Code != B.Code
              AND B.Code = 'Default'
WHERE  A.Code NOT IN (SELECT A.Code
                      FROM   #Source A
                      JOIN   #Code B ON A.Code = B.Code)
   AND A.ProviderId = B.ProviderId )

尝试使用此