0

我有以下代码我必须加入 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   
4

3 回答 3

3

使用将用于过滤结果的新列将您的查询包装在 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
于 2019-09-19T13:54:18.803 回答
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

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

于 2019-09-19T09:02:09.373 回答
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 之间添加的(任意)字符串在 CITYNAME 中不存在。最后,我提供的代码没有正确解释任何空值。我会将 City.CityName 和 Country.Id 的每个实例替换为 isnull(City.CityName,'') 和 isnull(Country.Id,'')。

于 2019-09-19T16:15:21.333 回答