查询3个表的主键,而不重复单个列

时间:2013-03-05 14:02:47

标签: sql join

我有三张桌子

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(值1

显示结果
PK_ID
101
201
301
302

应该显示所有唯一ID,而不重复。

1 个答案:

答案 0 :(得分:3)

UNION运算符将消除重复项,因此您只需要:

SELECT A_ID
FROM [Table A]

UNION

SELECT B_ID
FROM [Table B]

UNION

SELECT C_ID
FROM [Table C]

更新:在聊天中,您说了以下内容:

  

表A与表B相关,A_ID与表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加入A,以便您只获取A.X_ID为特定值的记录。您可以做的最好的事情是让Table C中的所有值与B中匹配A.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_IDX_ID之间建立明确的关系才能实现这一目标。