【问题标题】:Join a table only if result set > 0仅当结果集 > 0 时才加入表
【发布时间】:2011-06-06 10:58:16
【问题描述】:

我有一个表 A 与一个表 B 连接,这给了我一个结果集。 我想将表 C 加入到以前的表中以限制结果集。但是如果这个连接没有结果,我希望得到与以前相同的结果集(不考虑 C)。

你能想出用 SQL 来做这件事的方法吗?

【问题讨论】:

  • 尝试谷歌搜索outer join
  • 您使用的是什么 DBMS?甲骨文、PostgreSQL、SQL Server、MySQL、SQLite、...?
  • OUTER JOIN的问题是我一直得到所有的结果,而加入这个新表的目标是限制结果集。
  • 应该在 AS/400 和 DB2 上工作。

标签: sql join


【解决方案1】:

常规 SQL 不可能,因为它涉及逻辑。

最好的办法是制作一个小脚本,例如(伪代码)

select * into #tmp from x inner join y inner join z where blabla;
if (exists (select * from #tmp))
BEGIN
  select * from #tmp
END
else
BEGIN
   select * from x inner join y where blabla;
END

编辑:

但如果我是你,我总是会使用 LEFT JOIN 与 C 连接,这样你就可以查看结果是否在一个或另一个结果集中...

例如

select x.*, y.*, case when z.id is null then 0 else 1 end from x inner join y left join z on blabla where blabla;

但这当然假设您能够更改读取结果的代码路径。

【讨论】:

  • 为什么不简单地使用外连接?
  • 当我读到这个问题时,这不是他想要做的......他想要两个截然不同的数据集,具体取决于其中一个的值
  • 电影你是对的,这正是我想要做的,但我的目标是保持在 SQL 级别。您不认为使用 CASE 或其他关键字可能吗?
  • 我的伪代码是SQL(我用的是sql server语法),你应该可以在db2中做类似的东西
  • 感谢您能够破译 OP 的目标!
【解决方案2】:
SELECT *
FROM TableA
INNER JOIN TableB
    ON TableA.ID = TableB.TableAID
LEFT JOIN TableC
    ON TableC.ID = TableB.TableCID

这将返回表 A 和 B 中的所有行,但仅返回表 C 中符合 ON 条件的行。

否则条件连接并不真正适用于标准 SQL。如果您使用的是 SQL Server,您可以执行一些存储过程逻辑来检查 TableC 中的结果,如果没有则只从表 A 和 B 中获取数据。但是这种方法是特定于提供程序的

【讨论】:

  • 这样做的问题是我仍然会得到连接的 A 和 B 表的所有结果。
【解决方案3】:

我发现 LEFT/OUTER JOIN 方法存在问题。如果你这样做,你可能会得到一些在 A 和 B 中但不在 C 中的结果。如果我理解得很清楚,porpouse 是将 AB 与 C 连接起来,我的意思是与 C 交叉时的结果必须包括三个限制。所以@Cine 解决方案非常适合这种情况。

【讨论】:

    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多