SQL Server - INNER JOIN WITH DISTINCT
Posted
技术标签:
【中文标题】SQL Server - INNER JOIN WITH DISTINCT【英文标题】: 【发布时间】:2012-01-23 22:26:17 【问题描述】:我很难做到以下几点:
select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
inner join (select distinct LastName from
ValTbl v where a.LastName = v.LastName)
我想在 ValTbl 上进行连接,但只针对不同的值。
【问题讨论】:
【参考方案1】:我认为您实际上为您的问题中的正确答案提供了一个良好的开端(您只需要正确的语法)。我遇到了同样的问题,将 DISTINCT 放在子查询中确实比这里提出的其他答案成本更低。
select a.FirstName, a.LastName, v.District
from AddTbl a
inner join (select distinct LastName, District
from ValTbl) v
on a.LastName = v.LastName
order by Firstname
【讨论】:
这对我来说似乎是正确的答案。接受的答案是在查询运行后对所有内容都执行不同的操作(从性能角度来看这很糟糕),但 OP 只希望 ValTbl 是不同的,他并没有说他也希望删除 AddTbl 中的重复记录。跨度> 【参考方案2】:选择不同的 a.FirstName、a.LastName、v.District 来自 AddTbl a 内连接 ValTbl v 在 a.LastName = v.LastName 按 a.FirstName 排序;
希望对你有帮助
【讨论】:
这个问题是在 6 年前提出的——他们可能不再需要那个答案了 :-)【参考方案3】:您可以使用 CTE 获取第二个表的不同值,然后将其与第一个表连接。 您还需要根据 LastName 列获取不同的值。您可以使用按 LastName 分区并按 FirstName 排序的 Row_Number() 来执行此操作。
这是代码
;WITH SecondTableWithDistinctLastName AS
(
SELECT *
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY LastName ORDER BY FirstName) AS [Rank]
FROM AddTbl
)
AS tableWithRank
WHERE tableWithRank.[Rank] = 1
)
SELECT a.FirstName, a.LastName, S.District
FROM SecondTableWithDistinctLastName AS S
INNER JOIN AddTbl AS a
ON a.LastName = S.LastName
ORDER BY a.FirstName
【讨论】:
【参考方案4】:在开始时执行 select distinct 是不一样的,因为您浪费了结果中的所有计算行。
select a.FirstName, a.LastName, v.District
from AddTbl a order by Firstname
natural join (select distinct LastName from
ValTbl v where a.LastName = v.LastName)
试试看。
【讨论】:
NATURAL JOIN
在 MSSQL 2008 R1 中是 incorrect syntax
【参考方案5】:
试试这个:
select distinct a.FirstName, a.LastName, v.District
from AddTbl a
inner join ValTbl v
on a.LastName = v.LastName
order by a.FirstName;
或者这个(作用相同,但语法不同):
select distinct a.FirstName, a.LastName, v.District
from AddTbl a, ValTbl v
where a.LastName = v.LastName
order by a.FirstName;
【讨论】:
【参考方案6】:在“select”之后添加“distinct”。
select distinct a.FirstName, a.LastName, v.District , v.LastName
from AddTbl a
inner join ValTbl v where a.LastName = v.LastName order by Firstname
【讨论】:
以上是关于SQL Server - INNER JOIN WITH DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章
sql server join ,inner join ,left join ,right join 的使用
SQL Server - INNER JOIN WITH DISTINCT
使用 INNER JOIN 更新 SQL Server 中的多个表 [重复]
Sql Server 与 MySql 在使用 update inner join 时的区别