我有以下代码,我必须连接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
答案 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的每个实例。