【问题标题】:Join if not exists如果不存在则加入
【发布时间】:2019-07-07 07:43:01
【问题描述】:

我遇到了以下问题:

我有一个很长的查询(我们称之为查询 "Z" ),其中包含许多连接和子查询。它输出两列:

  • A:物品
  • B:整数属性,范围保证为1-10

我想从不作为查询 Z 的输出出现的表 X 项目(列 A)中加入,并给它们一个任意属性值 10(列 B)。

我尝试使用内部子查询 uisng 不存在创建子查询,但这需要将我的原始查询复制到内部并且需要很多时间(我什至没有设法执行它)。

有什么建议吗?谢谢

【问题讨论】:

  • 所以你基本上希望得到一个表,其中包含查询“Z”的所有结果以及不在“Z”中的所有项目(来自哪里?),第二列作为值“10”?整数属性是否限制为 10 ? “Z”中存在的所有项目是否都有值
  • 你的 DBMS 是 Oracle 还是 MySQL?
  • 1) 是的,我希望得到一个包含查询 Z 的结果的表,该表包含查询中的计算属性以及表 X 中第二列值为 10 的所有项目。2) 整数限制为 10,是的,“Z”中的所有项目都有值
  • 数据库Oracle
  • 请通过编辑而非 cmets 进行澄清。请对minimal reproducible example 采取行动并点击谷歌搜索“stackexchange 作业”并展示您的能力。

标签: oracle join subquery exists


【解决方案1】:

您的问题并不完全清楚,但我认为您的意思是表 X 是查询 Z 中记录的超集。如果是这样,一个简单的外连接应该会给你你想要的结果:

select coalesce(z.a, x.a) as a
       , coalesce(z.b, 10) as b
from x
     left outer join ( your query ) z
     on z.a = x.a

如果 X 不是 Z 的超集,那么您应该尝试使用 FULL OUTER JOIN。


我假设列 A 用作查询 Z 和表 X 的 UID。如果不是这种情况,您需要调整上述声明,或编辑您的问题以包含更多详细信息。

【讨论】:

  • 对我来说看起来不错。不过,coalesce(z.a, x.a) as a 可以缩短为 x.a
  • @ThorstenKettner - 是的,你是对的。我在left outerfull outer 之间徘徊作为合适的连接。如果是full outer,我们需要合并两列。
【解决方案2】:

根据您的 cmets ,一种可能性是首先对“Z”查询的结果创建一个union,然后再创建一个 select,另外只选择 B 列的 MIN()。 所以它看起来类似于:

SELECT A , MIN(B) FROM
(
  (QUERY Z) AS Z 
  union
  (SELECT ITEM as A, 10 as B FROM X)
)
GROUP BY A

【讨论】:

  • 一个不错的技巧。只是不像 APC 的查询那么简单,而且可能要慢得多。
  • 必须同意这一点。但不知何故,我以前从未听说过合并。总是很高兴学习新事物。
【解决方案3】:

我的做法与@Ancaron 发布的类似。

SELECT A, B FROM Z
UNION ALL
SELECT A, '10' FROM X
WHERE NOT EXISTS 
(
select Z.A
from Z
WHERE Z.A=X.A
)

【讨论】:

  • 所以你还在运行 Z 查询两次?我以为那是你试图避免的。
猜你喜欢
  • 2018-09-17
  • 2023-03-23
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2017-04-24
  • 2014-06-11
相关资源
最近更新 更多