金沙官网线上聚合不应出现在 UPDATE 语句的集合列

修改语句:

子查询与连接
数据准备

update A set WZCount=ISNULL(WZCount,0)+(select SUM(WZCount) from T_PM_OutStock_SUB where MaterialID =A.MaterialID and _MainID='{_AutoID}') from T_PM_MaterialStock A,T_PM_OutStock_SUB

一、复习:
MYSQL记录操作:写操作(insert、update、delete)和读操作select
二 子查询和连接
tdb_goods表结构
good_id---商品ID good_name---商品名称 good_eate 商品类型
brand_name 品牌名称 goods_price 商品价格 is_show 是否上架
is_saleoff 是否售空
虽然MySQL配置了客户端和服务器的编码格式均为utf8编码,但在已建的数据表插入记录时,MySQL仍然不识别中文,会抛出Incorrect String Value异常。
该问题的解决办法即:

系统报错:

  1. 在插入记录之前,通过SET NAMES gbk;设置客户端的编码格式,即敲入的是什么编码,客户端会自动将插入命令转换成utf8编码
  2. 当然在查询记录之前,也需要通过SET NAMES gbk;设置客户端数据显示的编码,否则会出现乱码
  3. SET NAMES gbk;只会影响客户端显示数据的编码,对源数据不会有任何影响
    子查询
    1.子查询是指出现在【其他SQL语句内】的SELECT子句
    eg:
    SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
    其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement)
    SELECT column1 FROM t2 称为Sub Query[子查询]
    ps:Outer Query[外查询]并不单单指SELECT等查询语句,而是所有的SQL语句,当一个SQL语句包含了子查询,则包含子查询的语句就叫外查询
    2子查询的条件:
    1)始终出现在圆括号内;
    2)可以包含多个关键字或者条件;如 distinct、group by、order by、limit、函数等 (改为大写)
    3)子查询的外查询可以是:【SELECT,INSERT,UPDATE,SET或DO】。SQL语句的统称
    3.子查询的返回值
    子查询可以返回标量、一行、一列或子查询

聚合不应出现在 UPDATE 语句的集合列表中

使用比较运算符的子查询
使用比较运算符
=、>、<、>=、<=、<>、!=、<=>
语法结构
operand comparison_operator subquery

问题:

SELECT AVG (col_name) FROM tbl_name;
查找数据表中某列的平均值

修改语句中不能出现聚合函数这一类的

SELECT AVG(goods_price) FROM tdb_goods; //AVG函数代表求其平均值//
SELECT ROUND(AVG(goods_price),2) FROM tdb_goods; //round(@,#)代表对@数字进行四舍五入,且保留小数点后#位输出//
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=5391.30; //输出价格大于5391.30的id、name、price//
综合起来运用子查询时:
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=(SELECT ROUND(AVG(goods_price),2) FROM tdb_goods); //查找价格大于平均值的商品//
SELECT goods_price FROM tdb_price WHERE goods_cate='超级本'G; //检索分类为”超极本”的商品价格且一网格显示//
对于ANY、SOME、ALL的用法各有不同:(ANY和SOME用法相同)
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=ANY (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');

解决问题:

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');

那就把聚合函数放到select 查询与查出来当成一个数据表   再用数据表和原先的数据表匹配 进行添加

SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price>=SOME (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本');
第二种子查询---[NOT] IN
in 相当于 = any
not in 相当于 != all 或者<>all ——不等于、不包含
子查询----exists not exists ——用得比较少
子查询返回任何行 exists 返回 true 反之 返回 false
-- = ANY 或 = SOME 等价于 IN
EG:SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price !=ALL (SELECT goods_price FROM tdb_goods WHERE goods_cate='超级本' )//得到19个记录(22-3)
SELECT goods_id,goods_name,goods_price FROM tdb_goods WHERE goods_price IN (SELECT goods_price FROM tdb_goods WHERE goods_cate = '超级本')
//得到3个记录
第三种子查询.使用 [NOT] EXISTS 的子查询(较少用)
子查询的总结
1.子查询是指在另一个查询语句中的SELECT子句。
例句:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
其中,SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement),
SELECT column1 FROM t2 称为Sub Query[子查询]。
所以,我们说子查询是嵌套在外查询内部。而事实上它有可能在子查询内部再嵌套子查询。
子查询必须出现在圆括号之间。
行级子查询
SELECT * FROM t1 WHERE (col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
SELECT * FROM t1 WHERE ROW(col1,col2) = (SELECT col3, col4 FROM t2 WHERE id = 10);
行级子查询的返回结果最多为一行。
优化子查询
-- 创建数据表
CREATE TABLE IF NOT EXISTS tdb_goods(
goods_id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
goods_name VARCHAR(150) NOT NULL,
goods_cate VARCHAR(40) NOT NULL,
brand_name VARCHAR(40) NOT NULL,
goods_price DECIMAL(15,3) UNSIGNED NOT NULL DEFAULT 0,
is_show BOOLEAN NOT NULL DEFAULT 1,
is_saleoff BOOLEAN NOT NULL DEFAULT 0
);

修改之后;

-- 写入记录

UPDATE T_PM_MaterialStock
SET WZCount = WZCount+TB.ALLCount
FROM (SELECT
b.MaterialID,SUM(b.Count) AS ALLCount
FROM
T_PM_MaterialStock a
INNER JOIN
T_PM_OutStock_SUB b
ON a.MaterialID = b.MaterialID
WHERE b._MainID='{_AutoID}'
GROUP BY
b.MaterialID
) AS TB
WHERE
T_PM_MaterialStock.MaterialID = TB.MaterialID

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('R510VC 15.6英寸笔记本','笔记本','华硕','3399',DEFAULT,DEFAULT);

正常示例:

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('Y400N 14.0英寸笔记本电脑','笔记本','联想','4899',DEFAULT,DEFAULT);

UPDATE    库存表2
SET              库存数量 = TB.剩余数量
FROM  (SELECT 
      入库表.条形码,SUM(入库表.剩余数量) AS 剩余数量
      FROM  
      库存表2 
      INNER JOIN
      入库表 
      ON 库存表2.条形码 = 入库表.条形码 
      GROUP BY
      入库表.条形码
      ) AS TB 
      WHERE
      库存表2.条形码 = TB.条形码
另外一个语句写的例子:

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('G150TH 15.6英寸游戏本','游戏本','雷神','8499',DEFAULT,DEFAULT);

UPDATE T_PM_MaterialEntry_SUB
SET Surplus = ISNULL(Surplus,0)+TB.ALLCount
FROM (SELECT
b.SourceNumID,SUM(b.Count) AS ALLCount
FROM
T_PM_MaterialEntry_SUB a
INNER JOIN
T_PM_OutStock_SUB b
ON a._AutoID = b.SourceNumID
WHERE b._MainID='{_AutoID}'
GROUP BY
b.SourceNumID
) AS TB
WHERE
T_PM_MaterialEntry_SUB._AutoID = TB.SourceNumID

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X550CC 15.6英寸笔记本','笔记本','华硕','2799',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('X240(20ALA0EYCD) 12.5英寸超极本','超级本','联想','4999',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('U330P 13.3英寸超极本','超级本','联想','4299',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('SVP13226SCB 13.3英寸触控超极本','超级本','索尼','7999',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad mini MD531CH/A 7.9英寸平板电脑','平板电脑','苹果','1998',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('iPad Air MD788CH/A 9.7英寸平板电脑 (16G WiFi版)','平板电脑','苹果','3388',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES(' iPad mini ME279CH/A 配备 Retina 显示屏 7.9英寸平板电脑 (16G WiFi版)','平板电脑','苹果','2788',DEFAULT,DEFAULT);

INSERT tdb_goods (goods_name,goods_cate,brand_name,goods_price,is_show,is_saleoff) VALUES('IdeaCentre C340 20英寸一体电脑 ','台式机','联想','3499',DEFAULT,DEFAULT);

本文由金沙官网线上发布于数据库,转载请注明出处:金沙官网线上聚合不应出现在 UPDATE 语句的集合列

您可能还会对下面的文章感兴趣: