0

小さなデータベースから連絡先のリストを取得する SQL クエリがあります。それはデータをうまく引き出します。ただし、SQL の問題は、連絡先に関連付けられている電子メールとアドレスの数に応じて、同じ連絡先が複数回リストされることです。

一度だけリストすることになっています。ここに私が書いたSQLがあります:

SELECT DISTINCT 
                Contact_Main.contactid, first_name, last_name, p_title,
                prefix, suffix, email, address1, address2, 
                city, state, zip, Contact_Address_Type.addresstype, 
                Contact_Email_Types.emailtype, 
                addressid, emailid, Contact_Address_Type.addresstypeid, 
                Contact_Email_Types.emailtypeid,
                (SELECT COUNT(addressid) 
                       FROM Contact_Address 
                       WHERE contactid = Contact_Main.contactid) as num_addresses,
                (SELECT COUNT(emailid) 
                        FROM Contact_Email 
                        WHERE contactid = Contact_Main.contactid) as num_emails
        FROM Contact_Main
        LEFT JOIN Contact_Email ON Contact_Main.contactid = 
                                                    Contact_Email.contactid
        LEFT JOIN Contact_Email_Types ON Contact_Email_Types.emailtypeid =
                                                    Contact_Email.emailtypeid
        LEFT JOIN Contact_Address ON Contact_Address.contactid = 
                                                    Contact_Main.contactid
        LEFT JOIN Contact_Address_Type ON Contact_Address_Type.addresstypeid  = 
                                                    Contact_Address.addresstypeid 
        ORDER BY last_name, first_name;

これは単純な修正であり、これの一部をサブクエリにする必要があると確信していますが、何らかの理由でそれを理解できません。

4

2 に答える 2

0

これはうまくいきますか?

SELECT DISTINCT 
                cm.contactid
                , first_name
                , last_name
                , p_title
                , prefix
                , suffix
                , email
                , address1
                , address2
                , city
                , state
                , zip
                , cat.addresstype
                , cet.emailtype
                , addressid
                , emailid
                , cat.addresstypeid
                , cet.emailtypeid
                --, (SELECT COUNT(addressid) 
                --     FROM Contact_Address 
                --     WHERE contactid = cm.contactid) as num_addresses
                --, (SELECT COUNT(emailid) 
                --      FROM Contact_Email 
                --      WHERE contactid = cm.contactid) as num_emails
        FROM Contact_Main cm
        LEFT JOIN Contact_Email ce ON cm.contactid = 
                                                    ce.contactid
        LEFT JOIN Contact_Email_Types cet ON cet.emailtypeid =
                                                    ce.emailtypeid
        LEFT JOIN Contact_Address ON ca.contactid = 
                                                    cm.contactid
        LEFT JOIN Contact_Address_Type ON cat.addresstypeid  = 
                                                    ca.addresstypeid 
        ORDER BY cm.last_name, cm.first_name;
于 2012-07-27T03:19:15.957 に答える
0

さて、私が仕事をしていたとき、私は上司に SQL コードの扱いについて尋ねました。私たちは両方ともそれを見て、彼はそれが可能なすべての結果を返していると判断しました. SQL Access でシミュレーションをいじった後、単なる LEFT JOIN の代わりに LEFT OUTER JOIN を実行する必要があることがわかりました。

    SELECT DISTINCT Contact_Main.contactid, first_name, last_name, p_title,
                    prefix, suffix, email, address1, address2, 
                    city, state, zip, Contact_Address_Type.addresstype, 
                    Contact_Email_Types.emailtype, 
                    addressid, emailid, Contact_Address_Type.addresstypeid, 
                    Contact_Email_Types.emailtypeid,
  (SELECT COUNT(addressid) FROM Contact_Address 
   WHERE contactid = Contact_Main.contactid) as num_addresses,
  (SELECT COUNT(emailid) FROM Contact_Email 
  WHERE contactid = Contact_Main.contactid) as num_emails
  FROM Contact_Main
  LEFT OUTER JOIN Contact_Email 
  ON Contact_Main.contactid = Contact_Email.contactid
  LEFT OUTER JOIN Contact_Email_Types
  ON Contact_Email_Types.emailtypeid = Contact_Email.emailtypeid
  LEFT OUTER JOIN Contact_Address 
  ON Contact_Address.contactid = Contact_Main.contactid
  LEFT OUTER JOIN Contact_Address_Type 
  ON Contact_Address_Type.addresstypeid  = Contact_Address.addresstypeid 
  ORDER BY last_name, first_name;

そして、それはトリックをしました。すべての提案をありがとう!

于 2012-07-29T02:40:37.550 に答える