【问题标题】:How can I remove the subquery from the select statement?如何从 select 语句中删除子查询?
【发布时间】:2022-01-02 11:19:43
【问题描述】:

我需要帮助才能从原始 SELECT 语句中删除子查询。这甚至可能吗?我需要这个来最终将这样的查询移动到 Denodo/VQL,它不允许 SELECT 语句中的子查询(但允许 CTE/WITH 和 FROM/WHERE 中的子查询)。

select case when material in (
    select material
    from schema.material_table
    where old_material like '%55AD%'
  ) then 'Found'
  else 'Not Found'
end
from schema.material_table;

【问题讨论】:

    标签: sql oracle subquery common-table-expression denodo


    【解决方案1】:

    我可以看到几个选项。最直接的翻译似乎是:

    SELECT CASE
             WHEN m2.MATERIAL IS NOT NULL THEN 'Found'
             ELSE 'Not Found'
           END AS IZZIT_THERE
      FROM SCHEMA.MATERIAL_TABLE m2
      RIGHT OUTER JOIN SCHEMA.MATERIAL_TABLE m1
        ON m1.MATERIAL = m2.MATERIAL
      WHERE m1.OLD_MATERIAL LIKE '%55AD%'
    

    RIGHT OUTER JOIN 的使用可能不熟悉。要切换到更熟悉的LEFT OUTER JOIN,我们需要颠倒查询中表的位置并改变条件的呈现方式:

    SELECT CASE
             WHEN m1.MATERIAL IS NOT NULL THEN 'Found'
             ELSE 'Not Found'
           END AS IZZIT_THERE
      FROM SCHEMA.MATERIAL_TABLE m1
      LEFT OUTER JOIN SCHEMA.MATERIAL_TABLE m2
        ON m2.MATERIAL = m1.MATERIAL
      WHERE m1.OLD_MATERIAL LIKE '%55AD%'
    

    我保持别名不变,这样您就可以看到它们在查询中是如何移动的。在这两个查询中,m1 是主表,也就是说,它是必须提供数据的表,而m2 是辅助表或“可选”表——它可能有也可能没有数据与主匹配。

    就个人而言,我更喜欢联接而不是子查询,因为我发现它们更容易理解,但 YMMV。

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2015-08-02
      • 2011-05-09
      • 1970-01-01
      • 2011-11-05
      • 2014-09-01
      相关资源
      最近更新 更多