sql—使用或组合两个联接表上的 predicate

lkaoscv7  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(293)

我有三张table:

t_tbl
-----
t_id PK
t

p_tbl
-----
p_id PK
p

x_tbl
-----
x_id PK
x
t_id
p_id

我的搜索是分开工作的:
查询1:

SELECT x
FROM x_tbl xt
INNER JOIN
t_tbl tt
ON
xt.t_id = tt.t_id

问题2:

SELECT x
FROM x_tbl xt
INNER JOIN
p_tbl pt
ON xt.p_id = pt.p_id

但我想得到 xt.x 如果 xt.t_id = tt.t_id OR xt.p_id = pt.p_id

f2uvfpb9

f2uvfpb91#

我会尝试两个左连接,然后评估是否找到其中一个:

select
  x.x
from
  x_tbl x
  left join p_tbl p on
    p.p_id = x.p_id
  left join t_tbl t on
    t.t_id = x.t_id
where
  p.i_id is not null or t.t_id is not null
hjzp0vay

hjzp0vay2#

也许 吧 UNION 结果如何?

SELECT x FROM x_tbl xt INNER JOIN t_tbl tt ON xt.t_id = tt.t_id
UNION
SELECT x FROM x_tbl xt INNER JOIN p_tbl pt ON xt.p_id = pt.p_id
mum43rcc

mum43rcc3#

任何 JOIN 它可以在另一边找到多个匹配的行(从描述中不清楚这种情况是否会发生在您的db设计中。)似乎您不希望这样。另一边有许多行和/或多个连接,很快就会变得非常昂贵。
好像你想要一排 x_tbl ,在符合条件的情况下。 EXISTS 是一种永远不会在 x_tbl . 它也应该是最快的。

SELECT x.x
FROM   x_tbl x
WHERE  EXISTS (SELECT FROM t_tbl t WHERE t.t_id = x.t_id)
OR     EXISTS (SELECT FROM p_tbl p WHERE p.p_id = x.p_id)

这可能发生在2x上 LEFT JOIN :
两个sql左连接产生不正确的结果

相关问题