「最大」のフィルターで参加し、私は、SQL Serverに2014T-SQLは
を使用している私は私に重複する電話番号のまたは数字を与えないために、次たい:私は理解できない
WITH Phones as
(
SELECT * FROM (VALUES
(1,'602 600 8000'),
(2,'602 600 8001'),
(3,'602 600 8002')
) AS Vict_t (Id,Number)
), InvoicePhones as
(
SELECT * FROM (VALUES
(10, 1, 100, 'Alpha'),
(11, 1, 101, 'Bravo'),
(12, 1, 102, 'Charlie'),
(13, 2, 103, 'Alpha'),
(14, 2, 104, 'Bravo'),
(15, 2, 105, 'Charlie'),
(16, 3, 106, 'Alpha'),
(17, 3, 107, 'Bravo'),
(18, 3, 108, 'Charlie')
) as ip_t (Id,PhoneId,VoiceId, Name)
), Voices as
(
SELECT * FROM (VALUES
(100, '201701'),
(101, '201702'),
(102, '201703'),
(103, '201704'),
(104, '201705'),
(105, '201706'),
(106, '201708'),
(107, '201709'),
(108, '201710')
) AS Voices_t (Id,BillingCycle)
)
SELECT P.Id PhoneId, P.Number, IP.Name
FROM Phones P
LEFT JOIN InvoicePhones IP on IP.PhoneId = P.Id and IP.VoiceId =
(
select TOP 1 id
from Voices V
where V.Id = IP.VoiceId
order by V.BillingCycle desc
)
をサブ選択が重複を排除していない理由私が受けてる何
はこれです:
1 602 600 8000 Alpha
1 602 600 8000 Bravo
1 602 600 8000 Charlie
2 602 600 8001 Alpha
2 602 600 8001 Bravo
2 602 600 8001 Charlie
3 602 600 8002 Alpha
3 602 600 8002 Bravo
3 602 600 8002 Charlie
私は期待していこれは何です:
1 602 600 8000 Charlie
2 602 600 8001 Charlie
3 602 600 8002 Charlie
この例では、単純な整数IDのだが、私が働いている実際のテーブルを使用していますユニーク識別子を使用しています。したがって、私が必要とする答えはそれを考慮する必要があります。
私はこのaccepted answerの両方のバージョンを試しましたが、それは私のためには機能しません。
私には何が欠けていますか?次のように私が選んだ答えに加えて
更新
、私はこの問題を解決するための別の方法を実現している。
SELECT P.Id PhoneId, P.Number, IP.Name
FROM Phones P
LEFT JOIN InvoicePhones IP on IP.PhoneId = P.Id and IP.VoiceId =
(
select TOP 1 V.Id
from Voices V
INNER JOIN InvoicePhones IPS ON IPS.VoiceId = V.Id
WHERE P.Id = IPS.PhoneId
order by V.BillingCycle desc
)
、彼らはまた、OUTERを解決することができる場合、私は興味が適用されas mentioned in this other SO post
? –
あなたのサンプルデータはあまり良くありません。なぜなら 'select * from phones'はそれらの結果を得るには十分なものだからです。 –
'サブセレクションが重複を排除していない理由を理解できません。なぜでしょうか?あなたのサブセレクトはあなたが与えたデータで '1と1 = 1'と言ったこととほとんど変わりません。したがって、あなたの全体的なクエリーには違いはありません。 – ZLK