【问题标题】:Add null row only if there's no result for such pe_num仅当此类 pe_num 没有结果时才添加空行
【发布时间】:2011-08-27 01:14:43
【问题描述】:

我有几个查询联合在一起,它们都共享相同的键 - pe_num(integer)。我在任何地方都使用 UNION,但是子查询本身有 INNER JOINS(它们在与对象链接的其他表中寻找某种类型的实例),所以如果这个对象没有某种类型的实例,相应的查询将返回 no结果。结果表必须以某种方式包含所有 pe_num,例如如果此对象没有任何类型的实例,则必须添加空行(ONLY ONE null row),如果有类型 1 的实例,但没有类型 2 的实例,则查询类型 2 不得返回空行。

如果我有 16 个具有不同 pe_num 的对象,则所有 16 个数字都必须在表中(它们有时会重复,但不能缺少一个)。

实现此结果的一般方法是什么?

【问题讨论】:

  • 也许一些代码、示例数据、预期结果可能有助于使这更有意义...

标签: sql


【解决方案1】:

我不确定我是否正确地阅读了您的问题,但在我看来,您有一个数据库模式,它可以模拟一些继承关系,所以我将在我的其余答案中假设这一点。

您的问题(如果我理解的话)是关于如何确定某些对象集是哪些派生类的实例——所讨论的对象位于基表中,主键为 pe_num,派生表都有pe_num 的外键。

期望的结果——列:pe_num,derived_class;每个 pe_num 至少返回一行;如果该 pe_num 没有派生实例,则 'derived_class' 为 NULL

策略:按照涉及 UNION 的基本过程(如上所述)查找基对象是其实例的所有派生类。正如您所指出的,可能缺少一些行。所以 'LEFT JOIN' 所需的行到子类结果('LEFT JOIN' 类似于 'INNER JOIN' 但如果它在右侧没有找到匹配的行,它只是插入一个具有左侧值的行和一个右边为NULL——joins in MySQL):

SELECT pe_num, derived_class
FROM base_table
LEFT JOIN ( ** some complicated subquery involving UNION's as mentioned in OP **)
USING (pe_num)

【讨论】:

  • 我完全忘记了这个问题,因为我第二天解决了这个问题,左外连接丢失了 pe_num,但是你的查询也可以,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多