使用过程MySQL创建视图时出错
尝试使用过程创建视图时出现问题。我必须这样做,因为我需要在MySQL中创建一个透视,将一个表的行转换为另一个表的列。 这个查询工作得很好,但是当我把它放在“createview”语句中时,它给了我一个错误 下面是带有CREATE视图的查询使用过程MySQL创建视图时出错,mysql,view,pivot-table,procedure,Mysql,View,Pivot Table,Procedure,尝试使用过程创建视图时出现问题。我必须这样做,因为我需要在MySQL中创建一个透视,将一个表的行转换为另一个表的列。 这个查询工作得很好,但是当我把它放在“createview”语句中时,它给了我一个错误 下面是带有CREATE视图的查询 CREATE VIEW `Untitled` AS SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(formazioni_persone.id_formazi
CREATE VIEW `Untitled` AS
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(formazioni_persone.id_formazione = ',
formazioni.id,
', true, false)) AS "',
formazioni.titolo,'"'
)
) INTO @sql
FROM formazioni;
SET @sql = CONCAT('SELECT persone.*, ', @sql, ' FROM persone INNER JOIN formazioni_persone ON persone.id = formazioni_persone.id_persona GROUP BY persone.id');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
没有创建视图的查询Untitled
AS效果很好
没有创建视图的查询无标题
效果很好。我已经尝试在create视图中创建一个临时表,但是什么都没有。也尝试过使用这样的分隔符,但什么都没有
DELIMITER $$
CREATE VIEW `Untitled` AS
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(formazioni_persone.id_formazione = ',
formazioni.id,
', true, false)) AS "',
formazioni.titolo,'"'
)
) INTO @sql
FROM formazioni;
SET @sql = CONCAT('SELECT persone.*, ', @sql, ' FROM persone INNER JOIN formazioni_persone ON persone.id = formazioni_persone.id_persona GROUP BY persone.id');
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END $$
DELIMITER ;
错误:1064-您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解在第2行“SET@sql=NULL”附近使用的正确语法,时间:0.082000s。视图只是一个SELECT语句,在定义视图时必须有固定的列。您不能创建同时也是过程的视图 抱歉,如果需要透视表,则需要为查询中的每列指定值。您不能进行选择查询,也不能创建在查找潜在未来值时动态添加更多列的视图 而且无论如何,您也不能定义运行任意程序代码块的视图。这需要一个程序 您应该只使用问题中已经显示的解决方案,如 没有其他捷径或解决办法 顺便说一下,所有SQL数据库都有这个限制,不仅仅是MySQL
你的问题是: 我正在寻找一种不需要手动更新查询的解决方案 数据透视表查询在选择列表中的列数必须与希望其返回的列数相同。没有办法使SQL查询根据执行时读取的数据动态扩展列数 进行单个查询以返回所有数据的唯一方法是不要执行透视表查询,而是返回行中的所有数据,而不是列中的所有数据
SELECT p.*, f.titolo, pf.id_persona IS NOT NULL AS ha_formazioni
FROM persone AS p
CROSS JOIN formazioni AS f
LEFT OUTER JOIN formazioni_persone AS fp ON fp.id_formazioni AND fp.id_persona = p.id
这将为每个
formazioni
每个persone
返回一行。然后,您必须在应用程序中编写代码,以循环reesult的所有行,并以您想要的方式格式化列中的数据。恕我直言,当您凭空编写语法时,它工作的可能性很小。是的,确实如此。但在MySQL中,没有办法实现pivot。我找到的唯一方法是使用IF/CASE。为了动态地实现它(因为我从中获取列的表将发生变化),我认为我没有任何其他解决方案。。。但是任何建议都是值得赞赏的谢谢你,现在明白了。你有什么建议可以让它充满活力吗?查询中的CASE/IF数量将发生变化,我正在寻找一种不需要手动更新查询的解决方案