私は次のことをするのに苦労しています:
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で結合を行いたいのですが、異なる値に対してのみです。
これを試して:
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;
ネイト 、あなたは実際にあなたの質問で正しい答えの正しいスタートを提供したと思います(正しい構文が必要です)。私はこれとまったく同じ問題を抱えていましたが、サブクエリに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
結果から計算されたすべての行を無駄にしているため、最初に個別の選択を行うことは同じではありません。
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)
それを試してください。
「選択」の後に「個別」を追加します。
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
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
addTblから個別のa.FirstName、a.LastName、v.Districtを選択します。a.LastNameでの内部結合ValTbl v a.FirstNameによるv.LastNameの順序。
お役に立てれば