2016-07-25 14 views
-1

私は2つのテーブルを使用する次のクエリを持っています。 1つは連絡先、もう1つはEmailです。連絡先には、ContactId、FirstName、LastNameという列があります。 Emailには、EmailId、ContactId、EmailAddressという列があります。MS SQL - レコードを変更せずに姓と名を表示

基本的な重複チェックを実行するこのクエリがあります。数値とEメールを返します(2 - [email protected] = 2の連絡先には[email protected]というメールがあります)。電子メールに関連付けられた名字と姓を表示しようとしていますが、そうすると、生成されるデータの量が変わります。これは、ファーストネームとラストネームが添付された電子メールを取得している可能性が高いためです。

ここにクエリがあります。私はSELECT CONTACT.LASTNAMEとCONTACTを入力しようとします。 FIRSTNAMEはGROUP BYと同様に、出力されるデータの量を変更します。より多くの列が作成されます(予想されます)が、さらに行があり、データは実際にはあまり関連性がありません(より多くのNULLが戻されます)。これを引き起こしているのはどうしたらいいですか?

SELECT COUNT(CONTACT.CONTACTID) AS [DUPLICATECOUNT], EMAIL.ADDRESS AS [EMAILADDRESS] 
FROM CONTACT 
INNER JOIN EMAIL on EMAIL.ContactID = CONTACT.ContactId 
GROUP BY EMAIL.ADDRESS 
HAVING COUNT (CONTACT.ContactID) > 1 
ORDER BY [DUPLICATECOUNT] DESC 
+0

定義「生成されるデータの量を変更する」:より多くの列が(保証) ?より多くの行(非常にありそうもない)?前者の場合、他に何を期待しましたか?あなたはそれらを代わりに単一の列(「セル」と考える)として表示しますか? –

+0

多くの列、少ない行 EDIT:実際には行は増えますが、技術的にはデータが少なくなります(nullがさらに表示されます) –

+0

期待どおりの結果はありますか?あなたが理解したように、2つのフィールドでグループ分けすると、名前が異なる場合にカウントに影響が及ぼされ、より多くの結果が追加されます。名前を1つの列に結合したいですか? – sgeddes

答えて

0

MS SQL Serverが2008以降の場合、ウィンドウ関数を使用して重複を見つけることができます。サンプルクエリは次のようになります。

select c.firstname, c.lastname, e.emailaddress, 
     count(c.contactid) over(partition by e.emailaddress order by e.emailaddress) cnt 
from contact c 
    inner join email e on c.contactid = e.contactid 
order by cnt desc 
0

OK、あなたはそれが電子メールに関連した姓と名を表示するために取得しようとしている。

select FirstName, LastName 
FROM CONTACT C WITH (NOLOCK), EMAIL E WITH (NOLOCK) 
where C.ContactID = E.ContactId 
AND EmailAddress='[email protected]' 
関連する問題