Sql 条件联接3表-难以指定要返回的表和列
在SQL Server中工作 我有三张桌子Sql 条件联接3表-难以指定要返回的表和列,sql,sql-server,join,conditional-statements,Sql,Sql Server,Join,Conditional Statements,在SQL Server中工作 我有三张桌子 [TESTDB].[dbo].[TestList] [Routing].[dbo].[WUList] [Routing].[dbo].[WUArea] [TESTDB].[dbo].[TestList]数据看起来像 TestID 1089 41651 1235 6987 51555 71666 TestIDS AreaPerson1 AreaPerson2 AreaPerson3 01089 TSmith M
[TESTDB].[dbo].[TestList]
[Routing].[dbo].[WUList]
[Routing].[dbo].[WUArea]
[TESTDB].[dbo].[TestList]数据看起来像
TestID
1089
41651
1235
6987
51555
71666
TestIDS AreaPerson1 AreaPerson2 AreaPerson3
01089 TSmith MBlevins OMyhead
01099 RJohns NULL NULL
03368 RJohns TPayne MSmith
45646 TSmith MBlevins NULL
55566 NULL MBlevins WRestle
77788 ORandy NULL LOrdy
02347 MArt TPayne MSmith
03333 NULL NULL NULL
04444 NULL NULL NULL
Area AreaPerson1 AreaPerson2 AreaPerson3
01 ORandy MBlevins OMyhead
03 RJohns SNicks IPfreely
04 RJohns MBlevins BFort
07 TSmith SNicks BFort
41 MArt TSmith WRestle
45 ORandy ORandy ORandy
51 ... ... ...
52 ... ... ...
71 ... ... ...
[Routing].[dbo].[WUList]数据看起来像
TestID
1089
41651
1235
6987
51555
71666
TestIDS AreaPerson1 AreaPerson2 AreaPerson3
01089 TSmith MBlevins OMyhead
01099 RJohns NULL NULL
03368 RJohns TPayne MSmith
45646 TSmith MBlevins NULL
55566 NULL MBlevins WRestle
77788 ORandy NULL LOrdy
02347 MArt TPayne MSmith
03333 NULL NULL NULL
04444 NULL NULL NULL
Area AreaPerson1 AreaPerson2 AreaPerson3
01 ORandy MBlevins OMyhead
03 RJohns SNicks IPfreely
04 RJohns MBlevins BFort
07 TSmith SNicks BFort
41 MArt TSmith WRestle
45 ORandy ORandy ORandy
51 ... ... ...
52 ... ... ...
71 ... ... ...
[Routing].[dbo].[WUArea]数据看起来像
TestID
1089
41651
1235
6987
51555
71666
TestIDS AreaPerson1 AreaPerson2 AreaPerson3
01089 TSmith MBlevins OMyhead
01099 RJohns NULL NULL
03368 RJohns TPayne MSmith
45646 TSmith MBlevins NULL
55566 NULL MBlevins WRestle
77788 ORandy NULL LOrdy
02347 MArt TPayne MSmith
03333 NULL NULL NULL
04444 NULL NULL NULL
Area AreaPerson1 AreaPerson2 AreaPerson3
01 ORandy MBlevins OMyhead
03 RJohns SNicks IPfreely
04 RJohns MBlevins BFort
07 TSmith SNicks BFort
41 MArt TSmith WRestle
45 ORandy ORandy ORandy
51 ... ... ...
52 ... ... ...
71 ... ... ...
我已经能够将[TestList]加入到[UWArea]或[WUList]我需要的数据显示方式,但我无法以我需要的方式加入3个列表
create table TestList
(
TestID int
)
insert TestList
values
(1089)
, (41651)
, (1235)
, (6987)
, (51555)
, (71666)
, (01099)
, (03368)
, (45646)
, (55566)
, (77788)
, (02347)
, (03333)
, (04444)
create table WUList
(
TestIDS int,
AreaPerson1 varchar(10)
, AreaPerson2 varchar(10)
, AreaPerson3 varchar(10)
)
insert WUList
values
('01089','TSmith','MBlevins','OMyhead')
, ('01099','RJohns',NULL,NULL)
, ('03368','RJohns','TPayne','MSmith')
, ('45646','TSmith','MBlevins',NULL)
, ('55566',NULL,'MBlevins','WRestle')
, ('77788','ORandy',NULL,'LOrdy')
, ('02347','MArt','TPayne','MSmith')
, ('03333',NULL,NULL,NULL)
, ('04444',NULL,NULL,NULL)
create table WUArea
(
Area varchar(3),
AreaPerson1 varchar(10)
, AreaPerson2 varchar(10)
, AreaPerson3 varchar(10)
)
insert WUArea
values
('01','ORandy','MBlevins','OMyhead')
, ('03','RJohns','SNicks','IPfreely')
, ('04','RJohns','MBlevins','BFort')
, ('07','TSmith','SNicks','BFort')
, ('41','MArt','TSmith','WRestle')
, ('45','ORandy','ORandy','ORandy')
select a.TestID
, case
when b.TestIDS is null or c.Area is null then 'JDoe'
else ISNULL(b.AreaPerson1,c.AreaPerson1)
end as AreaPerson1
, case
when b.TestIDS is null or c.Area is null then 'SDoe'
else ISNULL(b.AreaPerson2,c.AreaPerson2)
end as AreaPerson2
, case
when b.TestIDS is null or c.Area is null then 'TBuck'
else ISNULL(b.AreaPerson3,c.AreaPerson3)
end as AreaPerson3
from TestList a
left join WUList b on a.TestID = b.TestIDS
left join WUArea c on '0' + LEFT(a.TestID,1) = c.Area
请注意:上面TestList中的数据示例没有足够的相关数据,因此我将来自WUList表的TestID添加到TestList表中,以便进行更多操作
我很快就搞定了,所以如果表的数据集中有任何其他变化,那么您需要进行调整。到目前为止,它涵盖了你的所有基础(至少从我的理解来看)
如果您想在结果集中查看更多数据以验证是否对空值进行了解释,请使用下面的语句
select a.TestID, '0' + LEFT(a.TestID,1) as WUAreaTestID
, b.AreaPerson1
, case
when b.TestIDS is null or c.Area is null then 'JDoe'
else ISNULL(b.AreaPerson1,c.AreaPerson1)
end as AreaPerson1n
, b.AreaPerson2
, case
when b.TestIDS is null or c.Area is null then 'SDoe'
else ISNULL(b.AreaPerson2,c.AreaPerson2)
end as AreaPerson2n
, b.AreaPerson3
, case
when b.TestIDS is null or c.Area is null then 'TBuck'
else ISNULL(b.AreaPerson3,c.AreaPerson3)
end as AreaPerson3n
, c.*
from TestList a
left join WUList b on a.TestID = b.TestIDS
left join WUArea c on '0' + LEFT(a.TestID,1) = c.Area
谢谢!这肯定比我所能做到的要近。[TESTDB].[dbo].[TestList]实际上包含2319行数据。当我按TestID分组时,行计数被压缩为447行,这是期望的结果。这个解决方案产生的quote列比我预期的多出几列TestList表只包含一个字段,对吗?那么你是说在这个表中有重复的值,当你按TestID分组时,它会压缩到447?在这件事上,我不明白你的意思。另外,最终的查询语句只生成4列:TestID、AreaPerson1、AreaPerson2、AreaPerson3。你是在运行我为数据校对提供的第二个查询而不是第一个查询吗?Doua,你一针见血。测试时,我无意中运行了第二个查询,而不是第一个查询。非常感谢。TestList表包含多个列,但我只需要对照其他表查询第一列的值即可获得所需的结果。很抱歉漏掉了。我调整了解决方案,以包含所需的语言组及其完美!!!!答对了,我领先了。似乎“0”上的左侧区域c+左侧(a.TestID,1)=c。区域可能无法按预期工作。我发现,在应该返回c.[AreaPerson1]或person2或3的情况下,而是返回JDoe、SDoe或tbuckar的默认值。您是否说您上面的第5个最终目标是单独限定每个字段(AreaPerson1、AreaPerson2、AreaPerson3),而不是作为一个完整的记录?我认为这个目标影响了整个记录。例如:在上面的数据中,TestList.TestID值1235在与WUIST表(NULL)联接时不会得到结果,但在与WUArea表联接时确实会得到结果。您在目标#5中给出了一个“或”条件,但是您的意思是,对于TestID值1235,查询应该从WUArea表中返回AreaPerson1、AreaPerson2和AreaPerson3,因为它匹配?