2013-10-11 98 views
4

请参阅下面的DDL:CASE语句FROM子句

CREATE TABLE dbaddress 
(aid integer identity not null, link_id int, link_type char, primary key (aid)) 
CREATE TABLE dbDoorSupervisor 
(did integer identity not null, name varchar(30), primary key (did)) 
CREATE TABLE dbLicensee 
(lid integer identity not null, name varchar(30), primary key (lid)) 

INSERT INTO dbDoorSupervisor (name) values ('Ian') 
INSERT INTO dbLicensee (name) values ('Maria') 
INSERT INTO dbaddress (link_id, link_type) values (1,'D') 
INSERT INTO dbaddress (link_id, link_type) values (1,'L') 

我试图去开门监事根据所提供的Address.AID名称或许可。例如,如果辅助装置1的WHERE子句中被提供,然后伊恩从门监表中返回,但是,如果辅助装置2的WHERE子句然后玛利亚从许可表中返回在被供给。

我知道你可以使用CASE语句在SELECT子句中,但你可以用它们在FROM子句即从地址到持牌人或地址加入到门主管根据所提供的援助?

+0

没有,但你可以在两个表中加入,然后用一种情况, SELECT只读出每行的适当链接名称。或者,您可以做两个查询,一个查找一个类型,另一个查找另一个类型,并将它们组合在一起。 –

+0

@JacobM,谢谢。我认为答案是创建一个派生表,其中包含所有门主管和许可证持有人,我想你是暗示的。 – w0051977

回答

0

不无动态SQL,它有自己的一套问题。

如果你的数据库是简单的像这样,只有2个左右的可能性,一个简单的方法就是用成绩手动加入都和处理,如:

select 
    a.aid 
    ,case a.link_type 
     when 'D' then ds.name 
     when 'L' then l.name 
    end [name] 
from 
    dbaddress a 
left join 
    dbDoorSupervisor ds on a.link_type = 'D' and a.link_id = ds.did 
left join 
    dbLicensee l on a.link_type = 'L' and a.link_id = l.lid 
+0

有一个在dbDoorSupervisor和dbLicensee没有link_id列在OP模式:) –

+0

@RomanPekar更正。感谢您的支持。 –

2
select a.linkd_id, 
case when link_type = 'D' then d.name 
    when link_type = 'L' then l.name 
end as 'Name' 
from dbAddress a 
left join dbDoorSupervisor d on d.did = a.link_id 
left join dbLicensee l on l.lid = a.link_id 
4

可以在切换left outer join部分是这样的:

select 
    isnull(d.name, l.name) as name 
from dbaddress as a 
    left outer join dbDoorSupervisor as d on d.did = a.link_id and a.link_type = 'D' 
    left outer join dbLicensee as l on l.lid = a.link_id and a.link_type = 'L' 

,还是要参加,并在case语句

01切换

如果你有一个以上的列显示,您可以使用外适用,所以你不要”有重复的情况:

select 
    c.name, c.address, c.second_name 
from dbaddress as a 
    left outer join dbDoorSupervisor as d on d.did = a.link_id 
    left outer join dbLicensee as l on l.lid = a.link_id 
    outer apply (
     select d.name, d.second_name, d.address where a.link_type = 'D' union all 
     select l.name, l.second_name, l.address where a.link_type = 'L' 
    ) as c 
+0

作为一个侧面说明,如果有两个以上的组合和你一起去了'isnull'路线,你既可以嵌套它们像'ISNULL(ds.name,ISNULL(dl.name,dx.name))'或去与[聚结](http://msdn.microsoft.com/en-us/library/ms190349.aspx) –

+0

@JoeEnos加入溶液为多个列,它可以很容易地扩展为多于一个的组合 –