1

結合を使用してテーブルからデータにアクセスしようとしています。A の主キーの情報が与えられ、X から情報を取得したいと考えています。X に到達するには、B を経由する方法と C を経由する方法の 2 つの方法があります。どちらのパスを選択するかは、A の列から決定されます。 CASE WHEN を使用し、この方法で FROM ステートメントを使用してテーブルを結合する SQL ステートメントを作成しようとしました。

X - 結合 - B - 右外部結合 - A - 左外部結合 - C - 結合 - X

しかし、SQLは、両端で同じテーブルに参加できないことを教えてくれます。A は B または C のいずれかに接続されますが、両方には接続されないため、外部結合を使用します。

基本的には X からデータを取得する必要がありますが、A の列でどのパスと見なされるかによって、異なるキーを使用して X にアクセスします。

4

3 に答える 3

1

次のようなクエリを使用する必要があります。

SELECT X.* 
FROM A 
LEFT JOIN B ON B.A_id = A.id 
LEFT JOIN C ON C.A_id = A.id 
LEFT JOIN X ON X.id = IF(A.path = 'B', B.X_id, C.X_id) 
WHERE A.id = <numeric_id>;

これらのデータを使用して、MySQL でこのクエリをテストしました。

表 A:

------ ------
| | ID | パス |
 ------ ------
| | 1 | ビ |
| | 2 | ビ |
| | 3 | シー |
| | 4 | シー |
 ------ ------

表 B:

------ ------
| | A_id | X_id |
 ------ ------
| | 1 | 9 |
| | 2 | 8 |
 ------ ------

表 C:

------ ------
| | A_id | X_id |
 ------ ------
| | 3 | 7 |
| | 4 | 6 |
 ------ ------

表 X:

------ -------
| | ID | 値 |
 ------ -------
| | 1 | 10 |
| | 2 | 20 |
| | 3 | 30 |
| | 4 | 40 |
| | 5 | 50 |
| | 6 | 60 |
| | 7 | 70 |
| | 8 | 80 |
| | 9 | 90 |
 ------ -------

WHERE 句を削除して SELECT A.id, B.X_id, C.X_id, X.* を実行すると、次の結果が得られます。これにより、どのテーブルが X への実際のパスであるかが確認されます。

-------- -------- -------- -------- ---------
| | A.id | B.X_id | C.X_id | X.id | X.値 |
 ------ ------ ------ ------ ------- ---------
| | 1 | 9 | ヌル | 9 | 90 |
| | 2 | 8 | ヌル | 8 | 80 |
| | 3 | ヌル | 7 | 7 | 70 |
| | 4 | ヌル | 6 | 6 | 60 |
 -------- -------- -------- -------- ---------

それがあなたのために働くことを願っています!

于 2013-03-21T21:21:24.540 に答える
0

これは、次のように両方のパスを選択した場合に実行できます。

SELECT ....
FROM A

LEFT JOIN B ON A.bkey = B.bkey
LEFT JOIN X as XB ON B.xkey = XB.xkey

LEFT JOIN C ON A.ckey = C.ckey
LEFT JOIN X as XC ON C.xkey = XC.xkey

そして、(たとえば)Xからフィールド1が必要な場合は、次のような関数を使用できます。

SELECT ISNULL(XB.field1, XC.field1)...

またはそのようないくつか

于 2013-03-21T21:03:35.820 に答える