Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 条件联接3表-难以指定要返回的表和列_Sql_Sql Server_Join_Conditional Statements - Fatal编程技术网

Sql 条件联接3表-难以指定要返回的表和列

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

在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        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个列表

  • 并非每个睾丸都出现在[武林]或[武林地区]
  • 如果TestID出现在[UWList]中,则并非每一列都包含一个值
  • 某些TestID出现在[WUList]中,[WUList]中的每一列都包含NULL
  • 最终目标
  • 常见的联接字段有[TestList].[TestID]、[WUList].[TestID]和[WUArea].[Area]

  • 返回列[TestID]、[AreaPerson1]、[AreaPerson2]、[AreaPerson3]

  • 在将[TestList]加入[WUList]时,如果任何“persons”返回空值,则将[TestID]的前两位数加入[WUArea].[Area],并获得相应的“person”

  • **[TestList].[TestID]长度为4位,在加入[WUArea].[Area]时,应在左1位附加0。[TestID]长度为五位数,可使用左两位数连接

  • 如果[TestList].[TestID]没有出现在[WUIST]中,或者[TestList].[TestID]的左两位数字没有出现在[WUArea]中,则设置[AreaPerson1]=JDoe、[AreaPerson2]=SDoe、[Areaperson3]=TBuck

  • 这个让我晚上睡不着觉。非常非常感谢你的帮助

    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,因为它匹配?