web-dev-qa-db-ja.com

SQL Server-DISTINCTを使用した内部結合

私は次のことをするのに苦労しています:

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で結合を行いたいのですが、異なる値に対してのみです。

15
Nate Pet

これを試して:

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;
13
kol

ネイト 、あなたは実際にあなたの質問で正しい答えの正しいスタートを提供したと思います(正しい構文が必要です)。私はこれとまったく同じ問題を抱えていましたが、サブクエリに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   
6

結果から計算されたすべての行を無駄にしているため、最初に個別の選択を行うことは同じではありません。

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)

それを試してください。

2
AlfredoVR

「選択」の後に「個別」を追加します。

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
1

CTEを使用して2番目のテーブルの個別の値を取得し、それを最初のテーブルに結合できます。また、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
1

addTblから個別のa.FirstName、a.LastName、v.Districtを選択します。a.LastNameでの内部結合ValTbl v a.FirstNameによるv.LastNameの順序。

お役に立てれば

1