如何在多个左联接中获得唯一值

时间:2019-09-19 08:51:55

标签: sql-server filter unique-values

我有以下代码,我必须连接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 个答案:

答案 0 :(得分:2)

使用新列将查询语句包装在CTE中,以用于过滤结果。
此新列是由Dest.Code划分的ROW_NUMBER()窗口函数产生的:

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 :(得分:1)

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
  

注意:-子查询用于不同的值,而内部联接用于公共   仅值...

答案 2 :(得分:0)

我想将其视为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和substring将其拆分回去:

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之间添加的(任意)字符串。 最后,我提供的代码未正确说明任何空值。我将用notull(City.CityName,'')和isull(Country.Id,'')替换City.CityName和Country.Id的每个实例。