Исправить объединение табличных функций или не дублировать значения? - PullRequest
0 голосов
/ 24 февраля 2020

Итак, у меня есть запрос в 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

Я бы хотел, чтобы он возвращал только самую длинную запись (поскольку все имена являются либо мужем, женой, либо мужем & Жена), так как все суммы одинаковы, и я думаю, что это потому, что я оставляю присоединение базовой таблицы к таблице 1, таблице 2 и т. Д. c. Но как я могу это исправить? Есть ли функция для возврата только самого длинного имени?

Я смотрю на несколько левых соединений, похожих на это.

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

каждая таблица 1-таблица 4 имеет одинаковый код соединения.

1 Ответ

1 голос
/ 29 февраля 2020

Я могу предоставить только «сырое» решение 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 необходимо).

...