1

私の問題を説明する最も簡単な方法は、おそらくテーブルと取得しようとしている結果を示すことです。最後に試行したクエリが一番下にあります (機能しません)

次のテーブルがあります(簡単にするために、一連の列を削除しました):

クライアント テーブル:

-------------------------
| client_id   | name    |
-------------------------
| client_1    | Bob     |
-------------------------
| client_2    | Jane    |
-------------------------
| client_3    | Amy     |
-------------------------

契約表:

---------------------------------------------
| contract_id | client_id | amount  | date  |
---------------------------------------------
| contract_1 | client_1   | $5      | 01/02 |
---------------------------------------------
| contract_2 | client_1   | $25     | 21/03 |
---------------------------------------------
| contract_3 | client_2   | $40     | 25/05 |
---------------------------------------------

セッション テーブル:

------------------------------------------
| session_id  | client_id | contract_id  |
------------------------------------------
| session_1   | client_1  | contract_1   |
------------------------------------------
| session_2   | client_2  | contract_3   |
------------------------------------------
| session_3   | client_2  | contract_3   |
------------------------------------------
| session_4   | client_1  | contract_2   |
------------------------------------------
| session_5   | client_1  | contract_1   |
------------------------------------------

次のように、テーブルを結合し、すべての行を client_id と contract_id でグループ化する必要があります。

client 1, Bob
     |___ contract_1, $5, 01/02
            |___ Session 1
            |___ Session 5
     |___ contract_2, $25, 21/03
            |___ Session 4
client 2, Jane
     |___ contract_3, $40, 25/05
            |___ Session 2
            |___ Session 3
client 3, Amy

私の最近の試みは、テーブルで完全な外部結合を実行し、結果を client_id と contract_id でグループ化することでした。

SELECT * FROM    
    (SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        clients
    ON 
        clients.client_id = contracts.client_id       
    UNION 
    SELECT
        *
    FROM
        contracts
    LEFT OUTER JOIN 
        sessions
    ON 
        sessions.client_id = contracts.client_id)
AS tmp_table GROUP BY client_id, contract_id

さまざまなテーブルの列の数が異なるため (すべての列が必要なので、運が悪いため)、完全な外部結合の回避策は失敗し、「GROUP BY」はそれぞれの 1 行のみを返すように見えます (すべての行が必要なので、私にはうまくいきません。

この場合、パフォーマンスはまったく問題になりません。


Ronaldの回答に基づくSQLフィドル

それは私が必要とすることをするように見えます。回答を承認する前に、それを自分の生産テーブルに適応させ、見落としがないかどうかを確認します

4

1 に答える 1

1

次のクエリは望ましい結果をもたらしますか?

select cl.client_id, cl.name, co.contract_id, co.amount, co.date, se.session_id
from (client cl left join contract co
     on cl.client_id = co.client_id) left join session se
                 on co.contract_id = se.contract_id
order by cl.client_id, co.contract_id, se.session_id

(コメントの1つですでに指摘されているように:selectステートメントの結果は常にテーブルです)

ちょっとした質問: client_id がセッション テーブルの一部になっているのはなぜですか? これは過剰決定であり、データベース内であいまいさを引き起こす可能性があります。

于 2015-05-26T11:54:28.393 に答える