0

これが私が持っているテーブルです:

Table A which has entries with "item" and "grade" fields
Table B which has entries with A.id
Tuple table B-C

item="x"およびgrade="y"のすべてのAエントリと、item="x"およびgrade="y"のAエントリに関連付けられているBエントリに関連付けられているすべてのCエントリが必要です。 「」

例えば

A table:

    A.item = "x", A.Grade = "y", A.id = 1
    A.item = "x", A.Grade = "y", A.id = 2
    A.item = "x", A.Grade = "y", A.id = 3
    A.item = "r", A.Grade = "z", A.id = 4

B Table

   B.AID = 1, B.id = 10
   B.AID = 1, B.id = 11
   B.AID = 2, B.id = 13
   B.AID = 3, B.id = 14
   B.AID = 4, B.id = 15

B-C Tuple Table

   BID = 10, CID = 20
   BID = 11, CID = 20
   BID = 13, CID = 20
   BID = 15, CID = 21

C.id = 21は、アイテムとグレードの要件を満たさないAに関連付けられたBとのみタッピングされるため、クエリはAテーブルのすべてのエントリとCテーブルのエントリ20を返す必要がありますが、21は返しません。

4

1 に答える 1

0

関連付けは、文章では複雑に聞こえますが、単純に 3 つのテーブル ab結合するだけcです。

列を結合する必要がある方法を特定します。「A エントリに関連付けられた B エントリ」であり、列を見ると結合したいように聞こえますb.aid = a.idbと についても同様ですc

SELECT ...
FROM
    a
    JOIN b ON b.aid = a.id
    JOIN b_c ON b_c.bid = b.id
WHERE
    ...

これにより、3 つの正規化されたテーブルに分割される前の元のデータセットが構築されます。

次のステップは、指定された条件でフィルタリングすることです。" item = "x" および grade = "y"" の行のみが必要なため、それらを WHERE 句に追加して、テーブル名を前に付けます。この場合はオプションです):

WHERE
    a.item = 'x'
    AND a.grade = 'y'

最後に、SELECT 句で、本当に必要な列を選択できます。私はSELECT b_c.cidそうするだろうと思っています。ただし、テーブルもある場合は、cそのテーブルにも結合して、そこから列を選択することもできます。

于 2012-09-14T01:40:02.117 に答える