我有两张桌子 - 表记录包含列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
我能够使用左外连接将记录添加到表变量中,然后再次执行内连接。 我想知道我是否可以在一个选择中实现这一目标。
答案 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 )
尝试使用此