所以我在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
解决方案,因为我从未使用过NaviCat
。以下解决方案假定对于Identifier
-table1
中的任何一个table4
,Amount
和Date
值相同。您的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
。]