Mysql 转换为视图时出现sql参数错误
我是sql新手,我想知道为什么我在视图中创建sql查询时会出错 mysql查询:Mysql 转换为视图时出现sql参数错误,mysql,sql,sql-server,view,Mysql,Sql,Sql Server,View,我是sql新手,我想知道为什么我在视图中创建sql查询时会出错 mysql查询: SELECT staffid AS staff, (SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =1) AS a, (SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =2) AS b, (SELECT count(
SELECT staffid AS staff,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =1) AS a,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =2) AS b,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =3) AS c,
(SELECT count( feedback )FROM msqueue WHERE staffid = staff AND feedback =4) AS d
FROM msqueue
GROUP BY staffid
这个查询结果和我想要的一样
|staff| a | b | c | d |
|d1111| 0 | 1 | 1 | 0 |
|d1234| 1 | 2 | 4 | 0 |
但当我将查询创建为视图时
结果是
|staff| a | b | c | d |
|d1111| 1 | 3 | 5 | 0 |
|d1234| 1 | 3 | 5 | 0 |
请帮助我这个代码会发生什么。。非常感谢试试看
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
在原始查询中,您使用主select的列staffid
的别名将其与子查询的staffid
列配对。这还不足以区分这两列,因此您可以得到每行中所有内容的总和。通过在列名前面使用表别名m
和n
,我们现在可以清楚地解决这两个问题
列
请看这里:
甚至可以在子查询中省略表别名,如
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
编辑
经过我这方面的“聪明的口吻”,我才发现,你最初的陈述是有效的——至少是“独立的”()。我还没有试着把它放在视野中。也许这就是事情开始出错的时候。更安全的选择肯定是使用表别名
是的,当你把它放在一个视图中时,它确实出错了!但外部查询至少有一个表别名,一切正常: 我首先使用MySql对它进行了测试,但是语句都是一样的,在SQL Server中也一样,请参见这里
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue n WHERE n.staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
在原始查询中,您使用主select的列staffid
的别名将其与子查询的staffid
列配对。这还不足以区分这两列,因此您可以得到每行中所有内容的总和。通过在列名前面使用表别名m
和n
,我们现在可以清楚地解决这两个问题
列
请看这里:
甚至可以在子查询中省略表别名,如
SELECT staffid AS staff,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =1) AS a,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =2) AS b,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =3) AS c,
(SELECT count(*) FROM msqueue WHERE staffid = m.staffid AND feedback =4) AS d
FROM msqueue m
GROUP BY staffid
编辑
经过我这方面的“聪明的口吻”,我才发现,你最初的陈述是有效的——至少是“独立的”()。我还没有试着把它放在视野中。也许这就是事情开始出错的时候。更安全的选择肯定是使用表别名
是的,当你把它放在一个视图中时,它确实出错了!但外部查询至少有一个表别名,一切正常:
我首先使用MySql对其进行了测试,但是语句是相同的,在SQL Server中的工作原理也是一样的,请参见此处我没有访问MySql服务器来测试这一点,但就一般SQL而言,这可能是一个更简单的解决方案:
SELECT
staffid AS staff,
SUM(CASE WHEN feedback = 1 THEN 1 ELSE 0 END) AS a,
SUM(CASE WHEN feedback = 2 THEN 1 ELSE 0 END) AS b,
SUM(CASE WHEN feedback = 3 THEN 1 ELSE 0 END) AS c,
SUM(CASE WHEN feedback = 4 THEN 1 ELSE 0 END) AS d
FROM
msqueue
GROUP BY
staffid
我还没有访问mysql服务器来测试这一点,但就一般SQL而言,这可能是一个更简单的解决方案:
SELECT
staffid AS staff,
SUM(CASE WHEN feedback = 1 THEN 1 ELSE 0 END) AS a,
SUM(CASE WHEN feedback = 2 THEN 1 ELSE 0 END) AS b,
SUM(CASE WHEN feedback = 3 THEN 1 ELSE 0 END) AS c,
SUM(CASE WHEN feedback = 4 THEN 1 ELSE 0 END) AS d
FROM
msqueue
GROUP BY
staffid
终于明白了,您不能在mysql的视图中创建子查询。解决方法:为每个子查询创建一个视图。。。但在开始创建5个视图之前,请先看看我的答案;-)终于明白了,您不能在mysql的视图中创建子查询。解决方法:为每个子查询创建一个视图。。。但在开始创建5个视图之前,请先看看我的答案;-)很好的解决方案!而且。。。每个人都可以访问MySql服务器;-),请参见此处:。在将查询创建到视图之前,我的查询工作正常,但由于@cars10,它只需要表的别名,而不需要列的别名。这是一个不错的解决方案!而且。。。每个人都可以访问MySql服务器;-),请参见此处:。在将查询创建到视图中之前,我的查询工作正常,但由于@cars10,它只需要表的别名,而不需要列的别名。.解决方案不错。.现在我明白了错误所在。.它需要主表的别名。。谢谢。。。很好的解决方案现在我知道是什么错了它需要一个主表的别名。。谢谢。。。它起作用了。。