Как получить уникальные значения в множественном левом соединении - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть следующий код, я должен объединить 3 таблицы, но Dest.Code имеет повторяющиеся значения.Как я могу получить уникальные значения для Dest.Code?

Я пробовал DISTINCT, но не работает.

SELECT
   Dest.Code 
  ,City.CityName  
  ,Country.Id
FROM base.Dest
   Left join base.City
   On base.Dest.CityId = base.City.Id
   Left join base.Country 
   On base.City.CountryId = base.Country.Id

Это результат: Но ASA появляется дважды.Мне это нужно только один раз, не важно, какой.

Code    CityName    Id          
ASA     Ardmore     1E-599-4E   
ASA     Miami       8B-203-4D   
WBG     Rome        9S-893-2E   
BMU     Leon        2B-103-8E   

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Оберните ваш запрос в CTE новым столбцом, который вы будете использовать для фильтрации результатов.Этот новый столбец создается с помощью оконной функции ROW_NUMBER(), разделенной Dest.Code:

WITH cte as (
  SELECT Dest.Code, City.CityName, Country.Id,
  ROW_NUMBER() OVER (PARTITION BY Dest.Code ORDER BY City.CityName, Country.Id) AS rn   
  FROM Dest
  LEFT JOIN City ON Dest.CityId = City.Id
  LEFT JOIN Country ON City.CountryId = Country.Id
)
SELECT Code, CityName, Id
FROM cte
WHERE rn = 1
1 голос
/ 19 сентября 2019
SELECT
   Dest.Code 
  ,Dest.DestName 
  ,Dest.Code + ' ' + Dest.DestName as Destination
  ,Dest.Latitude
  ,Dest.Longitude
  ,Dest.CityId
  ,City.InternCityName 
  ,City.CityName 
  ,Country.CountryNameInt 
  ,Country.CountryName 
  ,Case 
     when Country.CountryName = 'Country' 
     then 'Local' 
     else 'Exterior' 
     end 
FROM DataBase.Destinations as Dest
INNER JOIN
(
    SELECT  DISTINCT Code,CityId FROM  DataBase.Destinations AS dest1 
)dest2

ON dest.CityId=dest2.CityId

Left join DataBase.Cities City
On Dest.CityId = City.Id

Left join DataBase.Countries Country
On City.CountryId = Country.Id

Примечание: - Подзапрос используется для отдельного значения, а внутреннее соединение только для общего значения ...

0 голосов
/ 19 сентября 2019

Мне нравится думать об этом как о творческой альтернативе CTE или чему-либо, использующему номера строк, но я не имею представления о производительности:

SELECT
   Dest.Code 
  ,max(City.CityName + ' ### ' + Country.Id)
FROM base.Dest
   Left join base.City
   On base.Dest.CityId = base.City.Id
   Left join base.Country 
   On base.City.CountryId = base.Country.Id
group by dest.code

Это проблема представления CityName и Country.Id какодин выходной столбец.Это может быть приемлемо - или вы можете использовать patindex, left и подстроку, чтобы разделить его обратно:

SELECT
   Dest.Code 
  ,left(max(City.CityName + ' ### ' + Country.Id),patindex('% ### %',max(City.CityName + ' ### ' + Country.Id))) CityName
  ,substring(max(City.CityName + ' ### ' + Country.Id),patindex('% ### %',max(City.CityName + ' ### ' + Country.Id)) + 5,len(max(City.CityName + ' ### ' + Country.Id))) Id
FROM base.Dest
   Left join base.City
   On base.Dest.CityId = base.City.Id
   Left join base.Country 
   On base.City.CountryId = base.Country.Id
group by dest.code

Это может стать немного грязным / трудным для понимания.Кроме того, (произвольная) строка, добавленная между CityName и Country.Id, ДОЛЖНА БЫТЬ ИЗВЕСТНОЙ, ЧТОБЫ НЕ СУЩЕСТВОВАТЬ В CITYNAME.Наконец, код, который я представляю, неправильно учитывает нулевые значения.Я бы заменил каждый экземпляр City.CityName и Country.Id на isnull (City.CityName, '') и isnull (Country.Id, '').

...