'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;
我正在练习 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;