0

ContactsテーブルとテーブルがありBusinesses、それらはテーブルを介して結合されていContacts_vs_Businessesます (これは多対多の関係です)。

2 つのテーブルに対してクエリを実行したい。連絡先が 2 つのビジネスに関連している場合、次を返したい:

  • すべての連絡先の詳細とビジネス A のすべての詳細を含む行。
  • すべての連絡先の詳細とビジネス B のすべての詳細を含む行
  • 連絡先の詳細がすべて含まれ、ビジネスの詳細がまったくない行 (SELECT最初のテーブルで基本的なことをしたかのように)

連絡先テーブル

ID Contact_Name Contact_Phone
1  Jez Clark    01234 567 890
2  Someone Else 01254 648 654

事業者表

ID Business_Name   Business_Address
1  A Company       24, A Street, A Town
2  Another Company 43, Another Street, Another Town

Contacts_vs_Businesses

Contact_ID Business_ID
1          1
1          2
2          2

戻りたい:

Contact_Name Contact_Phone Business_Name   Business_Address
Jez Clark    01234 567 890 A Company       24, A Street, A Town
Jez Clark    01234 567 890 Another Company 43, Another Street, Another Town
Jez Clark    01234 567 890 NULL            NULL

私は SQL Server 2008 R2 を使用しています。

これについてどうすればよいでしょうか (本当に簡単なことだと思います...)? OUTER 結合と INNER 結合、および LEFT/RIGHT 結合のさまざまな順列を試しましたが、最後の行の結果が得られないようです。

ありがとう

4

2 に答える 2

3

私があなたの質問を正しく理解していれば、2 つのビジネスに関連付けられている連絡先について、各ビジネスの連絡先を表示し、その後に NULL ビジネスを表示して、結果として 3 つのレコードを表示したいですか?

GROUP BYカウントを取得UNIONして NULL レコードを返すには、次のような方法を試してください。

SELECT C.Contact_Name, C.Contact_Phone, B.Business_Name, B.BusinessAddress
FROM Contacts C
  INNER JOIN Contacts_vs_Businesses CB ON C.Id = CB.Contact_ID
  INNER JOIN Businesses B ON CB.Business_Id = B.Id
  INNER JOIN (SELECT Contact_ID, COUNT(*) cnt FROM Contacts_vs_Businesses GROUP BY Contact_ID) CB2 ON C.Contact_ID = CB2.Contact_Id      
WHERE CB2.cnt = 2
UNION
SELECT C.Contact_Name, C.Contact_Phone, NULL, NULL
FROM Contacts
   INNER JOIN Contacts_vs_Businesses CB ON C.Contact_ID = CB.Contact_Id      
GROUP BY C.Contact_Name, C.Contact_Phone
HAVING Count(*) = 2

幸運を。

于 2013-01-30T19:22:41.810 に答える
0

結合と共用体が必要なため、これは簡単なクエリではありません。最初の 2 つの項目はかなり標準的です。3 番目の導入は、union all必要な場所です。

select Contact_Name, Contact_Phone, Business_Name, Business_Address
from Contacts_vs_Businesses cb join
     Businesses b
     on cb.Business_Id = b.id join
     Contacts c
     on cb.Contact_Id = c.id
union all
select Contact_Name, Contact_Phone, NULL, NULL
from Contacts
where Contact_Id in (select Contact_id
                     from Contacts_vs_Businesses cb
                     group by Contact_id
                     having COUNT(*) = 2
                    )
于 2013-01-30T19:37:21.543 に答える