0

ここでSQLの難問。

単純化した形式では、3 つのテーブルがあります。

テスト

tnum     name     
-------------
1        A        
2        B    

セクション

tnum     snum    num_of_qs
-------------------------
1        1        6
1        2        7

質問

tnum     qnum     
-------------
1        1        
1        2   

各テーブルには、明らかにそれよりも多くのデータがあります。

問題は、を除いてsectionテーブルとテーブルの間にリンクがないことです。私はこのSQL呼び出しを行っています:questiontnum

SELECT * FROM test t 
LEFT JOIN section s ON s.tnum = t.tnum
LEFT JOIN question q ON q.tnum = t.tnum...

何が起こるかというと、セクションごとに完全な質問セットが送信されます。ですから、17 セクションに分けられた 100 の質問がある場合、1700 の質問が得られます。

すべての質問とすべてのセクションを重複せずに 1 回の通話で取得する方法はありますか?

ありがとう

4

2 に答える 2

1
SELECT
    ts.tnum,
    ts.name,
    ts.snum,
    ts.num_of_qs,
    q.qnum
FROM
(SELECT     
    t.tnum,
    t.name,
    s.snum,
    s.num_of_qs
FROM test t
LEFT JOIN section s ON s.tnum = t.tnum) As ts
LEFT JOIN question q ON q.tnum = ts.tnum

上記のSQLステートメントを試してください。結合テストとセクション テーブルを使用して、仮想 "ts" テーブルを作成します。この ts テーブルは、最終的に質問テーブルと結合します。

于 2013-05-07T11:03:39.340 に答える
1

データベース構造は次のようにする必要があります(名前の列などを除いて、必要なフィールドのみを残してください):

質問:

  • qnum
  • スナム

セクション

  • スナム
  • tnum

テスト

  • tnum

(太字 - 主キー)

クエリは次のようになります。

SELECT
    q.qnum,
    s.snum,
    t.tnum
FROM
    questions q
    LEFT JOIN sections s ON q.snum = s.snum
    LEFT JOIN tests t ON s.tnum = t.tnum
于 2013-05-07T10:57:58.797 に答える