1

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

TABLE A 
      A_ID (PK)
      B_ID
      X_ID
      A_NAME

TABLE B
      B_ID (PK)
      A_ID
      B_NAME

TABLE C
      C_ID (PK)
      B_ID
      C_NAME

X_ID はバインド変数に結合され、それに基づいて主キーが照会されます。

クエリ結果で繰り返されることなく、3 つのテーブルからすべての主キーをクエリする必要があります。使用したクエリは次のとおりです。

SELECT TABLEA.A_ID,TABLEB.B_ID,TABLEC.C_ID
FROM TABLEA INNER JOIN TABLE B 
ON TABLEA.A_ID= TABLEB.A_ID JOIN TABLE C
ON TABLEB.B_ID= TABLEC.B_ID
WHERE TABLEA.X_ID = :bindVariable
ORDER BY TABLEA.A_NAME

アップデート:

列と値

A_ID          B_ID            C_ID        X_ID
101            201             301         1
101            201             302         1
101            202             303         2
102            202             304         2 

1しかし、結果を X_ID (値)に基づいて表示したい

PK_ID
101
201
301
302

一意の ID はすべて、繰り返さずに表示する必要があります。

4

1 に答える 1

3

演算子はUNION重複を排除するため、必要なのは次のとおりです。

SELECT A_ID
FROM [Table A]

UNION

SELECT B_ID
FROM [Table B]

UNION

SELECT C_ID
FROM [Table C]

更新:チャットで、あなたは次のように言いました:

表AはA_IDで表Bに関連付けられており、表Bと表CはB_IDで関連付けられています

上記のデータに基づくと、これを行うのに十分な明確な関係はないと思います。あなたは組合Aを組むことができ、Bそうすることができます:

SELECT A_ID
FROM [Table A]
WHERE X_ID = 1

UNION

SELECT B.B_ID
FROM [Table B] B
INNER JOIN [Table A] A
  ON B.A_ID = A.A_ID
WHERE A.X_ID = 1

しかし、あなたが説明した関係に基づいて、特定の値であるレコードのみを取得するような方法で参加Cする方法はありません。最善の方法は、少なくとも1回は一致する値と一致するすべての値を取得することです。AA.X_IDTable CBA.X_ID

SELECT A_ID
FROM [Table A]
WHERE X_ID = 1

UNION

SELECT B.B_ID
FROM [Table B] B
INNER JOIN [Table A] A
  ON B.A_ID = A.A_ID
WHERE A.X_ID = 1

UNION

SELECT C_ID
FROM [Table C]
WHERE B_ID IN (
  SELECT B.B_ID
  FROM [Table B] B
  INNER JOIN [Table A] A ON B.A_ID = A.A_ID
  WHERE A.X_ID = 1
)

それを行うためのよりクリーンな方法がある可能性は十分にありますが、私は仕事に戻らなければなりません。

tl; dr:近づくことはできますが、これを機能させるには、との間の明確な関係が必要C_IDですX_ID

于 2013-03-05T14:06:22.957 に答える