Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么oracle的查询会说';单行子查询返回多行';_Sql_Oracle_Oracle11g - Fatal编程技术网

Sql 为什么oracle的查询会说';单行子查询返回多行';

Sql 为什么oracle的查询会说';单行子查询返回多行';,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在用oracle编写sql查询。我的要求是我想用case有条件地更新数据库列。下面是我在三个表中使用的示例数据 create table z_product(uuid int, variationvalue varchar(10)); create table z_listprice(productid int, price int); create table z_variation(masterproductid int, productid int); insert into z_p

我正在用oracle编写sql查询。我的要求是我想用case有条件地更新数据库列。下面是我在三个表中使用的示例数据

create table z_product(uuid int, variationvalue varchar(10));
create table z_listprice(productid int, price int);
create table z_variation(masterproductid int, productid int);

insert into z_product values(1,null);
insert into z_product values(2,null);
insert into z_product values(3,null);
insert into z_product values(4,null);
insert into z_product values(5,null);
insert into z_product values(6,null);

insert into z_listprice values(1,10);
insert into z_listprice values(3,20);
insert into z_listprice values(5,10);
insert into z_listprice values(6,19);

insert into z_variation values(2, 1);
insert into z_variation values(2, 3);
insert into z_variation values(4, 5);
insert into z_variation values(4, 6);
如果“masterproductid”与“eqaul”的所有价格值相等,如果价格与“notequal”消息不同,我想更新“variationvalue”列

我尝试的问题是

UPDATE z_product pr SET pr.variationvalue =
        CASE WHEN ( SELECT numberofrows FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid)) = '1'
                    AND 
                    ( SELECT pricecount FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid)) >1
        THEN 'equal'
        ELSE 'notequal' END
WHERE pr.uuid = (SELECT prv.masterproductid
                    FROM z_variation prv, z_listprice prl
                    WHERE prv.productid = prl.productid 
                    AND pr.uuid = prv.masterproductid GROUP BY prv.masterproductid)

这个查询有什么问题。我做错了什么。任何建议都将得到极大的重视,再仔细研究一下,您似乎返回了多个ProductMasterID,因此返回了两个结果——请参阅此提琴:

结果如下:

NUMBEROFROWS PRICECOUNT PRODUCTMASTERID
2            1           4
2            1           2
这些子查询应该只返回一行用于CASE语句。因为您只检查第一列,所以添加了不同的作品。然而,如果NUMBEROFROWS是不同的值,那么DISTINCT本身就不起作用

UPDATE z_product pr SET pr.variationvalue =
        CASE WHEN ( SELECT DISTINCT numberofrows FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid)) = '1'
                    AND 
                    ( SELECT DISTINCT pricecount FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid)) >1
        THEN 'equal'
        ELSE 'notequal' END
WHERE pr.uuid = (SELECT prv.masterproductid
                    FROM z_variation prv, z_listprice prl
                    WHERE prv.productid = prl.productid 
                    AND pr.uuid = prv.masterproductid GROUP BY prv.masterproductid)
--编辑--

如果我正确地理解了您的需求——也就是说,对于任何给定的masterproductid,如果listprice表中的任何价格不同,那么您希望将variationvalue更新为notequal,但是如果价格相同,那么您希望将该列设为相等,然后尝试以下操作:

MERGE
INTO    z_product
USING   (
        SELECT COUNT(DISTINCT l.price) cnt,
          v.masterproductid
        FROM z_variation v
          JOIN z_listprice l on v.productid = l.productid
        GROUP BY v.masterproductid
        )
ON      (uuid = masterproductid)
WHEN MATCHED THEN
UPDATE
SET     variationvalue = CASE WHEN cnt = 1 THEN 'Equal' ELSE 'Not Equal' END

希望这有帮助

回答:

UPDATE z_product pr SET pr.variationvalue =
        CASE WHEN ( SELECT numberofrows FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid) WHERE pr.uuid = productmasterid) = '1'
                    AND 
                    ( SELECT pricecount FROM (SELECT COUNT(*)  AS numberofrows, pricecount , productmasterid
                              FROM ( SELECT COUNT(prl.price) AS pricecount , prl.price AS price, prv.masterproductid AS productmasterid
                                        FROM  z_variation prv, z_listprice prl
                                        WHERE prv.masterproductid = (SELECT prv.masterproductid
                                                                        FROM z_variation prv
                                                                        WHERE prv.productid = prl.productid GROUP BY prv.masterproductid)
                                        AND prl.productid = prv.productid
                                        GROUP BY prl.price, prv.masterproductid)
                    GROUP BY pricecount , productmasterid) WHERE pr.uuid = productmasterid) >1
        THEN 'equal'
        ELSE 'notequal' END
WHERE pr.uuid = (SELECT prv.masterproductid
                    FROM z_variation prv, z_listprice prl
                    WHERE prv.productid = prl.productid 
                    AND pr.uuid = prv.masterproductid GROUP BY prv.masterproductid)

@bernie我是sql新手,请纠正我的错误。抱歉,我的评论品味很差。我已经删除了它。错误消息意味着您的一个或多个子查询返回了多个值,因此Oracle不知道使用哪个值。@bernie我测试了所有子查询,这些子查询都没有出现错误,但组合在一起会导致错误。非常感谢您的回复。我需要检查所有MasterProductID的变体价格是否相同,如果相同,我必须使用相关信息更新产品表中的“variantvalue”列。如何做到这一点?感谢you@user964147--不幸的是,我得跑大约20分钟--当我回来时,请乐意帮忙。谢谢,等你回来help@user964147--对于z_产品表中的每条记录,您希望得到的结果是什么--这将非常有帮助。@sgedes非常感谢您让我回来,我得到了解决方案,我缺少子选择的条件