'Table does not exists' 尝试调用 CTN 并将查询存储在变量中时出错

'Table does not exists' error when trying to call a CTN and storing the query in a variable

我正在练习 MySQL 涉及旋转 table 的问题。我希望查询尽可能通用,所以我选择使用动态旋转。

下面是我的代码:

/* Change depending on table names */
WITH t AS (SELECT OCCUPATION AS Header FROM OCCUPATIONS GROUP BY OCCUPATION 
       ORDER BY FIELD(OCCUPATION,'Doctor', 'Professor', 'Singer', 'Actor')),

     t2 AS (SELECT NAME As Entries, OCCUPATION As Header, 
           ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS ID FROM OCCUPATIONS)

/* Dynamic pivoting code */
SELECT GROUP_CONCAT( CONCAT(' MAX(IF(Header = ''', t.Header ,''', Entries, NULL)) AS ',t.Header))
INTO @PivotQuery FROM t;

SET @PivotQuery = CONCAT(' SELECT ', @PivotQuery, ' FROM t2 GROUP BY ID');

PREPARE statement FROM @PivotQuery;
EXECUTE statement;
DEALLOCATE PREPARE statement;

当我执行这个时,我得到这个错误。 '第 12 行的错误 1146 (42S02):Table 't2' 不存在'

我能让代码工作的唯一方法是这样做:

/* Change depending on table names */
WITH t AS (SELECT OCCUPATION AS Header FROM OCCUPATIONS GROUP BY OCCUPATION 
       ORDER BY FIELD(OCCUPATION,'Doctor', 'Professor', 'Singer', 'Actor'))
       
/* Dynamic pivoting code */
SELECT GROUP_CONCAT( CONCAT(' MAX(IF(Header = ''', t.Header ,''', Entries, NULL)) AS ',t.Header))
INTO @PivotQuery FROM t;

SET @PivotQuery = CONCAT(' SELECT ', @PivotQuery, ' FROM 
                         
                         /* Declared t2 here instead */
                         (SELECT NAME As Entries, OCCUPATION As Header, 
                          ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS ID
                          FROM OCCUPATIONS)
                         /* End of Declaration */
                         
                         t2 GROUP BY ID');

PREPARE statement FROM @PivotQuery;
EXECUTE statement;
DEALLOCATE PREPARE statement;

我想知道为什么第一个查询可以调用 t 而第二个查询不能调用 t2? 另外,有没有一种方法可以在开头而不是在应该是通用代码的中间声明 t2? 谢谢!

好的,我明白了。我不是很了解,但 CTE 只存在于它之后的查询期间。所以对于下一个查询,CTN t2 已经不存在了。我选择使用临时表并得到了我想要的。 这是代码:

/* Change depending on table names */
CREATE TEMPORARY TABLE t AS 
    (SELECT NAME As Entries, OCCUPATION As Header, 
     ROW_NUMBER() OVER(PARTITION BY OCCUPATION ORDER BY NAME) AS ID
     FROM OCCUPATIONS);

WITH o AS (SELECT OCCUPATION AS Header FROM OCCUPATIONS GROUP BY OCCUPATION 
       ORDER BY FIELD(OCCUPATION,'Doctor', 'Professor', 'Singer', 'Actor'))
       
/* Dynamic pivoting code */
SELECT GROUP_CONCAT( CONCAT(' MAX(IF(Header = ''', o.Header ,''', Entries, NULL)) AS ',o.Header))
INTO @PivotQuery FROM o;

SET @PivotQuery = CONCAT(' SELECT ', @PivotQuery, ' FROM t GROUP BY ID');

PREPARE statement FROM @PivotQuery;
EXECUTE statement;
DEALLOCATE PREPARE statement;