简体   繁体   English

如何从 select 语句中删除子查询?

[英]How can I remove the subquery from the select statement?

I need help in removing the subquery out of the original SELECT statement.我需要帮助从原始 SELECT 语句中删除子查询。 Is this even possible?这甚至可能吗? I'm needing this to ultimately move queries like this to Denodo/VQL, which doesn't allow subqueries in SELECT statements (but does allow CTE/WITH and subqueries in FROM/WHERE).我需要这个最终将这样的查询移动到 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;

I can see a couple of options.我可以看到几个选项。 The most direct translation seems to be:最直接的翻译似乎是:

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%'

but the use of a RIGHT OUTER JOIN may be unfamiliar.但是RIGHT OUTER JOIN的使用可能并不熟悉。 To switch to the more familiar LEFT OUTER JOIN we need to reverse the position of the tables in the query and alter how the conditions are presented:要切换到更熟悉的LEFT OUTER JOIN ,我们需要反转查询中表的 position 并更改条件的呈现方式:

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%'

I kept the aliases the same so you can see how they moved around in the query.我保持别名相同,以便您可以看到它们在查询中是如何移动的。 In both queries m1 is the primary table, that is, it's the one that must provide data, while m2 is the secondary or "optional" table - it may or may not have data which matches the primary.在这两个查询中, m1是主表,也就是说,它是必须提供数据的表,而m2是辅助表或“可选”表——它可能有也可能没有与主表匹配的数据。

Personally, I prefer joins over subqueries as I find them easier to understand, but YMMV.就个人而言,我更喜欢连接而不是子查询,因为我发现它们更容易理解,但是 YMMV.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM