修复联接表函数还是不重复值?

问题描述 投票:0回答:1

所以我在NaviCat中有一个查询,它的一部分看起来像这样:

case
when base.table = 1 then Table1.Name
when base.table = 2 then Table2.Name
when base.table = 3 then Table3.Name
when base.table = 4 then Table4.Name 
end as Name

因为基本表具有标识符编号,但不包含人员名称。它已正确连接并且可以工作。但是,在某些情况下,它会使某些行增加三倍。

我可以得到类似于此的回复

Identifier         Amount              Name
12                 1000                Smith, Suzy
12                 1000                Smith, John
12                 1000                Smith, John & Smith, Suzy

我希望它只返回最长的条目(因为所有名称都是丈夫,妻子或丈夫和妻子),因为所有金额都相同,我想这是因为我离开了加入Base表的时间Table1,Table2等。但是如何解决此问题?是否有仅返回最长名称的函数?

我正在寻找一些与此类似的左连接。

Left join server.table1 as Table1 on Base.Identifier = Table1.Identifier AND Base.Date = Table1.Date

每个table1-table4具有相同的联接代码。

sql sql-server navicat
1个回答
0
投票

我只能提供“原始” SQL解决方案,因为我从未使用过NaviCat。以下解决方案假定对于Identifier-table1中的任何一个table4AmountDate值相同。您的FROM应该这样更改:

left join (
    select Identifier, Amount, Date, MAX(LEN(Name)) as LongestName
    from server.table1
    group by Identifier, Amount, Date
    UNION ALL
    select Identifier, Amount, Date, MAX(LEN(Name)) as LongestName
    from server.table2
    group by Identifier, Amount, Date
    UNION ALL
    select Identifier, Amount, Date, MAX(LEN(Name)) as LongestName
    from server.table3
    group by Identifier, Amount, Date
    UNION ALL
    select Identifier, Amount, Date, MAX(LEN(Name)) as LongestName
    from server.table4
    group by Identifier, Amount, Date
    ) as tables1to4 on Base.Identifier = tables1to4.Identifier AND Base.Date = tables1to4.Date

并且您的case表达式变为仅

tables1to4.LongestName as Name

如果最终结果中需要Amount,则同样适用(不需要case。]

© www.soinside.com 2019 - 2024. All rights reserved.