2011-12-19 72 views
13

我有一個很難做到以下幾點:SQL服務器 - INNER JOIN具有鮮明

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但僅用於不同值的加入。

回答

10

試試這個:

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

「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 
2

這是不一樣的做一個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) 

試試。

+3

'NATURAL JOIN'在MSSQL 2008 R1中是'不正確的語法' – itsho 2014-12-09 07:10:18

0

您可以使用CTE來獲取第二個表的不同值,然後將其與第一個表加入。 您還需要根據姓氏列獲取不同的值。您可以使用由姓氏分區的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 
1

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