当前位置: 首页 > 知识库问答 >
问题:

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

公冶森
2023-03-14

工作在SQL服务器

我有三张桌子

[TESTDB].[dbo].[TestList]
[Routing].[dbo].[WUList]
[Routing].[dbo].[WUArea]

[TESTDB]。[dbo]。[TestList]数据看起来像

TestID
1089
41651
1235
6987
51555
71666

[路由]。[dbo]。[WUList]数据看起来像

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

[路由]。[dbo]。[WUArea]数据看起来像

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]加入到[UWARE]或[WUList]我需要的数据显示方式,但我无法以我需要的方式加入3个列表。

  1. 并不是每个TestID都出现在[WUList]或[WUArea]
  2. 如果TestID出现在[UWList]中,则并非每一列都包含一个值
  3. 一些TestID出现在[WUList]中,[WUList]中的每一列都包含NULL

>

  • 常见的连接字段是[TestList]。[TestID],[WUList]。[TestIDS]和[WUArea]。[区域]

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

    将[TestList]加入[WUIST]时,如果任何“persons”返回NULL,请将[TestID]的前两位数字加入[WUIST]。[Area]并获取相应的“person”

    **[测试列表]。[TestID]长度为4位,在加入[WUArea]时,应在左1位附加0。[区域]。[TestID]长度为五位数,可使用左两位数连接

    如果[TestList]。[TestID]不出现在[WUList]或[TestList]的左两位数字中。[TestID]不出现在[WUArea]中,设置[AreaPerson1]=JDoe,[AreaPerson2]=SDoe,[Areaperson3]=TBuck

    这一次让我彻夜未眠。非常感谢你的帮助。

  • 共有1个答案

    吴嘉禧
    2023-03-14
    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
    
     类似资料:
    • 问题内容: 当表较小时,此查询具有合理的时间。我正在尝试确定什么是瓶颈,但是我不确定如何分析结果。 我已经尝试了INNER JOIN’ing和表的方法以及执行INNER SELECT的方法。两者有相同的时间。 这是EXPLAIN的链接:https : //explain.depesz.com/s/9lhr Postgres版本: x86_64-unknown-linux-gnu上的PostgreS

    • 问题内容: 我有两个表(“国家/地区”和“鸭子”),其中“国家/地区”表包含世界上每个国家/地区,并且“鸭子”表中有一个鸭子列表,其中有一个country_id字段可链接到主要国家/地区。 我正在尝试获取仅包含至少一只鸭子的国家/地区列表,并从鸭子表中找到该国家内评分最高的鸭子的单个匹配记录。到目前为止,我有: 这将返回每只鸭子的列表,而不是每个国家/地区的列表。 如果有人能指出我正确的方向,我将

    • 问题内容: 我想用sequelize ORM获得这样的查询: 问题是,后遗症不允许我在where子句中引用“ B”或“ C”表。以下代码 给我 这是完全不同的查询和结果 甚至不是有效的查询: 使用sequelize是否可以进行第一个查询,还是我应该坚持使用原始查询? 问题答案: 将引用联接表的列包装在

    • 我正在尝试从不同的表中选择2列(它们是连接的),但是我无法使用标准API使其工作。问题是,我已经创建了一个DTO类作为投影,但是我不能将连接的表实体转换为内部类。为了澄清问题,下面是我的课程: 用户: 角色: DTO类:

    • 嗨,伙计们,我正在使用Laravel5.5,我有两个表,用户和服务 用户表 ID 名称 电子邮件 密码 地址 城市 国家 邮政编码 null 提前谢了。热烈问候:阿卜杜拉·沙希德。

    • 问题内容: 作为hibernate可选连接的后续内容 系统中许多现有查询都依赖EntityOne和EntityTwo之间的映射关系,并且更改此关系不是一个吸引人的选择,但是我现在需要开始存储和检索联接表中不存在的值。顺便说一句,这可以与以下映射配合使用: ..但是,在查询时,如果结果的值在联接表中不存在,则该字段的值为null,并且我无法告知其实际值。我希望hibernate只在不存在关系的情况下