0

データベースに3つのテーブル(、、contractsおよびpartnerscustomersがあり、顧客とパートナーの両方にコントラクトを使用できます。

契約データのみをcontractsテーブルに保持し、customersテーブルにはidフィールドへの外部キーであるpartnersというフィールドが含まれています。contract_idcontracts

いいえ、契約を選択してリストに表示したいのですが、顧客とパートナーの契約が同時に使用されている場合は、リストに両方を表示したいのですが、機能しません。

私の質問は:

SELECT c.*, p.id AS partner_id, p.name AS partner_name, 
       cu.id AS customer_id, cu.name AS customer_name
FROM contracts AS c 
LEFT JOIN partners AS p ON c.id = p.contract_id
LEFT JOIN customers AS cu ON c.id = cu.contract_id

サンプル:contractテーブル のレコードは次のようになります。

    id  |   title   |   contract_start  |   contract_end
-------------------------------------------------------------
    1   |   Test    |   2012-10-02      |   2013-10-02
    2   |   Test2   |   2012-09-27      |   2013-09-27

customersテーブルのレコードは次のようなものです。

    id  |   code    |   name                |   contract_id
-------------------------------------------------------------
    1   |   123456  |   Customer1           |   1
    2   |   654321  |   Dummy Co. LTD.      |   2

partnersテーブルのレコードは次のようなものです。

    id  |   code    |   name                |   contract_id
-------------------------------------------------------------
    1   |   789456  |   Partner1            |   1

いいえ、3つのレコードのリストが必要です。各レコードには契約が表示され(そのうちの1つが繰り返されることを考慮)、各レコードにはパートナーまたは顧客の名前とIDが表示されます。契約に顧客が関与している場合、パートナーフィールドはそうである必要がnullあり、その逆も同様です。

4

1 に答える 1

4

あなたは言う:

いいえ、契約を選択してリストに表示したいのですが、顧客とパートナーの契約が同時に使用されている場合は、リストに両方を表示したいです。

おそらく、2つのテーブルを別々に結合し、UNION:を使用する必要があります。

SELECT c.*, 
       p.id AS partner_id, p.name AS partner_name, 
       NULL AS customer_id, NULL AS customer_name
FROM contracts AS c 
INNER JOIN partners AS p ON c.id = p.contract_id

UNION ALL

SELECT c.*, 
       NULL AS partner_id, NULL AS partner_name, 
       cu.id AS customer_id, cu.name AS customer_name
FROM contracts AS c 
INNER JOIN customers AS cu ON c.id = cu.contract_id

UNION ALL

SELECT c.*, 
       NULL, NULL,
       NULL, NULL 
FROM contracts AS c 
WHERE NOT EXISTS ( SELECT *  
                   FROM partners AS p
                   WHERE c.id = p.contract_id
                 )
  AND NOT EXISTS ( SELECT *
                   FROM customers AS cu 
                   WHERE c.id = cu.contract_id 
                 ) ;

(出力設定が異なる別の方法)
必要に応じて、最後の4つの列を2つに結合し、パートナーと顧客を区別するための列を追加できます。

SELECT c.*, 
       p.id AS partner_customer_id, p.name AS partner_customer_name, 'P' AS type 
FROM contracts AS c 
INNER JOIN partners AS p ON c.id = p.contract_id

UNION ALL

SELECT c.*, 
       cu.id , cu.name, 'C'
FROM contracts AS c 
INNER JOIN customers AS cu ON c.id = cu.contract_id ;
于 2012-12-07T19:19:44.783 に答える