0

私は4つのテーブルを持っています:

T1

ID   ID1   TITLE
1    100   TITLE1
2    100   TITLE2
3    100   TITLE3

T2

ID  TEXT
1   LONG1
2   LONG2

T3

ID1  ID2
100  200

T4

  ID4  ID2   SUBJECT
   1    200    A
   2    200    B
   3    200    C
   4    200    D
   5    200    E

この結果形式で出力したい:

TITLE    TEXT   SUBJECT

TITLE1   LONG1    A
TITLE2   LONG2    B
TITLE3   null     C
null     null     D
null     null     E

だから私はこのクエリを作成しましたが、本来よりもはるかに多くの結果が得られます。たとえば、タイトルは1回だけではなく何度も表示されます。

SELECT 
    t1.title,
    t2.text,
    t4.subject
FROM t1
    LEFT OUTER JOIN t2 ON t1.id=t2.id
    INNER JOIN t3      ON t1.id1=t3.id1
    LEFT OUTER JOIN t4 ON t4.id2=t3.id2
WHERE 
    t1.id1=100

手伝ってくれてありがとう

4

5 に答える 5

1

免責事項: 私は DB2 を扱っていません。ドキュメンテーションをざっと見てみると、DB2 がrow_number()完全な外部結合をサポートしていることがわかりましたが、私は簡単に間違っているかもしれません。

n:m 関係を取り除くには、追加のキーを作成する必要があります。この場合の簡単な解決策は、t1 と t4 の各レコードに行番号を追加し、それを結合条件として使用することです。Row_number はまさにそれを行い、 によって定義されpartition byた順序で昇順で定義されたデータのグループの番号を生成しますorder by

t1とt4ではレコード数に差があり、常にどちらが多いかわからないので、完全外部結合で結合しています。

テスト (Sql Server バージョン) @ Sql Fiddleを確認できます。

select t1_rn.title,
       t2.[text],
       t4_rn.subject
from
(
  select t1.id,
         t1.title,
         t1.id1,
         t3.id2,
         row_number() over(partition by t1.id1
                           order by id) rn
    from t1
   inner join t3
      on t1.id1 = t3.id1
) t1_rn
full outer join
(
  select t4.subject,
         t3.id1,
         t4.id2,
         row_number() over(partition by t4.id2 
                           order by id4) rn
    from t4
   inner join t3
      on t4.id2 = t3.id2
) t4_rn
  on t1_rn.id1 = t4_rn.id1
 and t1_rn.id2 = t4_rn.id2
 and t1_rn.rn = t4_rn.rn
left join t2
  on t1_rn.id = t2.id

この種の作業は、アプリケーションのプレゼンテーション側で行う必要がありますが、使用しているソフトウェアには既に準備されたデータが必要だと思います。

于 2012-06-06T00:47:29.287 に答える
0

テーブルを変更する必要があります。最後の結合はそれを出力に行います-クエリを分析するだけです。T1 からのすべてのレコードに対して、T4 からのすべてのレコードがあります。

于 2012-06-05T13:57:20.237 に答える
0

出力を見ると、すべてのサブジェクトを表示したいようです。これを知っていると、まずこのテーブルからすべてを構築する必要があります。

SELECT columns
FROM T4

次に、内部結合を構築します。

SELECT columns
FROM T4 subjectTable
    INNER JOIN T3 mapTable
    ON mapTable.ID2 = subjectTable.ID2

それらに満足したら、外部結合を使用してオプションの列を追加します。

SELECT columns
FROM T4 subjectTable
    INNER JOIN T3 mapTable
    ON mapTable.ID2 = subjectTable.ID2
    LEFT OUTER JOIN T2 textTable
    ON textTable.ID = subjectTable.ID4
    LEFT OUTER JOIN T1 titleTable
    ON titleTable.ID1 = mapTable.ID1
WHERE
    subjectTable.ID = 100;
于 2012-06-05T14:26:21.533 に答える
0

外部結合は、必要な行だけを照合するのではなく、行を複製することが保証されています。これを見たいと思うかもしれません: http://blog.sqlauthority.com/2009/04/13/sql-server-introduction-to-joins-basic-of-joins/

結合の種類とその使用方法を理解する。

関連するテキストとタイトルを含む件名のリストを探していますが、これは一意ではない可能性があります。各タイトルに複数のヌルが存在します。テーブル 4 から結合を実行し、件名のリストと、それぞれに関連付けられたタイトルを取得します。

于 2012-06-05T14:02:44.933 に答える
0

これを試して :

select t1.title,t2.text,t4.subject
from t4 
left join t3
on t4.id2=t3.id2
left join t1 
on t1.id1=t3.id1
left join t2
on t1.id=t2.id
where t1.id=100
于 2012-06-05T13:54:37.120 に答える