我需要幫助從原始 SELECT 陳述句中洗掉子查詢。這甚至可能嗎?我需要它來最終將這樣的查詢移動到 Denodo/VQL,它不允許 SELECT 陳述句中的子查詢(但允許 CTE/WITH 和 FROM/WHERE 中的子查詢)。
select case when material in (
select material
from schema.material_table
where old_material like 'UAD%'
) then 'Found'
else 'Not Found'
end
from schema.material_table;
uj5u.com熱心網友回復:
我可以看到幾個選項。最直接的翻譯似乎是:
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 'UAD%'
但是 a 的用法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 'UAD%'
我保持別名相同,以便您可以看到它們如何在查詢中移動。在這兩個查詢m1中,主表都是必須提供資料的表,而m2輔助表或“可選”表是主表——它可能有也可能沒有與主表匹配的資料。
就我個人而言,我更喜歡連接而不是子查詢,因為我發現它們更容易理解,但是 YMMV。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367886.html
上一篇:插入超過40k 行時如何提高性能
