1

我有三张桌子

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 将绑定到绑定变量,根据该变量查询主键。

我必须从三个表中查询所有主键,而不会在查询结果中重复它们我使用的查询是

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 

但我想根据 X_ID (value 1)显示结果

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 相关

根据上面的数据,我认为你没有足够清晰的关系来做到这一点。你可以联合起来AB像这样:

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重新加入。您可以做的最好的事情是获取匹配中的所有值至少匹配一次的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 回答