如何从 select 语句中删除子查询?
How can I remove the subquery from the select statement?
我需要帮助从原始 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;
我可以看到几个选项。最直接的翻译好像是:
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
,我们需要反转查询中 table 的位置并更改条件的显示方式:
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
是主要的 table,也就是说,它是 必须 提供数据的那个,而 m2
是次要的或“可选的” " table - 它可能有也可能没有与主要匹配的数据。
就个人而言,我更喜欢连接而不是子查询,因为我发现它们更容易理解,但是 YMMV。
我需要帮助从原始 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;
我可以看到几个选项。最直接的翻译好像是:
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
,我们需要反转查询中 table 的位置并更改条件的显示方式:
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
是主要的 table,也就是说,它是 必须 提供数据的那个,而 m2
是次要的或“可选的” " table - 它可能有也可能没有与主要匹配的数据。
就个人而言,我更喜欢连接而不是子查询,因为我发现它们更容易理解,但是 YMMV。