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

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

我有三张table:

  1. t_tbl
  2. -----
  3. t_id PK
  4. t
  5. p_tbl
  6. -----
  7. p_id PK
  8. p
  9. x_tbl
  10. -----
  11. x_id PK
  12. x
  13. t_id
  14. p_id

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

  1. SELECT x
  2. FROM x_tbl xt
  3. INNER JOIN
  4. t_tbl tt
  5. ON
  6. xt.t_id = tt.t_id

问题2:

  1. SELECT x
  2. FROM x_tbl xt
  3. INNER JOIN
  4. p_tbl pt
  5. ON xt.p_id = pt.p_id

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

f2uvfpb9

f2uvfpb91#

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

  1. select
  2. x.x
  3. from
  4. x_tbl x
  5. left join p_tbl p on
  6. p.p_id = x.p_id
  7. left join t_tbl t on
  8. t.t_id = x.t_id
  9. where
  10. p.i_id is not null or t.t_id is not null
hjzp0vay

hjzp0vay2#

也许 吧 UNION 结果如何?

  1. SELECT x FROM x_tbl xt INNER JOIN t_tbl tt ON xt.t_id = tt.t_id
  2. UNION
  3. 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 . 它也应该是最快的。

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

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

相关问题