我有两个问题:
WITH table1
AS (SELECT id,
first AS table1_first,
second AS table1_second
FROM some_table)
SELECT omt.*,
t1.*
FROM one_more_table omt
INNER JOIN table1 t1
ON omt.id = t1.id;
和
SELECT omt.*,
t1.*
FROM one_more_table omt
INNER JOIN (SELECT id,
first AS table1_first,
second AS table1_second
FROM some_table) AS t1
ON omt.id = t1.id;
告诉我这两个sql查询是否相同?
答案 0 :(得分:1)
从逻辑的角度来看,是的,它们完全相同。
但是,某些DBMS对公用表表达式(第一个查询)和派生表(第二个查询)应用不同的优化策略。
如果在“外部”查询中添加了where条件,该条件限制了CTE中的行,则可能不会将其下推到CTE中,从而可能产生不同的执行计划。
但这取决于所使用的DBMS(以上对于Postgres至少是正确的,我认为是Oracle。我不知道例如DB2,SQL Server或其他DBMS。)