我很难做到以下几点:
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上进行连接,但仅针对不同的值。
答案 0 :(得分:12)
试试这个:
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;
答案 1 :(得分:5)
Nate,我认为你在问题中提供了正确答案的良好开端(你只需要正确的语法)。我有这个完全相同的问题,并且将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
答案 2 :(得分:2)
在开头做一个选择不同是不一样的,因为你是在浪费结果中的所有计算行。
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)
试试。
答案 3 :(得分:1)
在“选择”之后添加“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
答案 4 :(得分:1)
您可以使用CTE获取第二个表的不同值,然后将其与第一个表连接。 您还需要根据LastName列获取不同的值。您可以使用由LastName分区的Row_Number()执行此操作,并按FirstName排序。
这是代码
;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
答案 5 :(得分:1)
选择不同的a.FirstName,a.LastName,v.District 来自AddTbl a 内连接ValTbl v 在a.LastName = v.LastName上 由a.FirstName订购;
希望这会有所帮助