Mysql 转换为视图时出现sql参数错误

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(

我是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( 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,它只需要表的别名,而不需要列的别名。.解决方案不错。.现在我明白了错误所在。.它需要主表的别名。。谢谢。。。很好的解决方案现在我知道是什么错了它需要一个主表的别名。。谢谢。。。它起作用了。。