首页 > 解决方案 > 如何有条件地禁用 SQL 中的联接?

问题描述

甲骨文,特别是。我需要在声明性查询中在 SQL 中执行以下操作,而不定义变量或 if 条件。考虑以下 SQL:

    SELECT * 
    FROM table1
    JOIN table2 on table2.a = table1.a
    WHERE table1.d = 4 
    AND c = (select c from table3 where b=3);

问题是,如果 table3 中没有匹配项,那么 table3 不应该限制行,table3 条件不应该适用(实际上只是删除了上述查询的最后一行)

如何在不首先定义变量的情况下在单个 SQL 语句中执行此操作?

标签: sqloracle

解决方案


您可以添加一个NOT EXISTS子句来有效地删除c = ...条件:

SELECT * 
FROM table1
JOIN table2 on table2.a = table1.a
WHERE table1.d = 4 
  AND (NOT EXISTS (SELECT c FROM table3 WHERE b=3)
       OR c = (SELECT c FROM table3 WHERE b=3)
      )

推荐阅读