【发布时间】:2018-07-19 03:49:07
【问题描述】:
我编写了一个标准的 SQL 选择查询来选择销售额最大的邮政编码。我现在需要将它转换为匿名 PL/SQL 块,但是我仍然对 PL/SQL 非常“绿色”,并且对于如何实现这一点真的没有太多想法。此外,我需要将 LIMIT 合并到 PL/SQL 匿名块中,以便在出现平局时仅显示最低数字邮政编码。
这里有一些数据表:
CREATE TABLE CUSTOMERS
(customerID INT PRIMARY KEY,
customerZip VARCHAR(15) NOT NULL);
CREATE TABLE SALES
(saleID INT PRIMARY KEY,
customerID INT,
CONSTRAINT SALES_FK1 FOREIGN KEY (customerID) REFERENCES CUSTOMERS(customerID));
INSERT INTO CUSTOMERS (customerID, customerZIP) VALUES (1, '20636');
INSERT INTO CUSTOMERS (customerID, customerZIP) VALUES (2, '20619');
INSERT INTO CUSTOMERS (customerID, customerZIP) VALUES (3, '20670');
INSERT INTO CUSTOMERS (customerID, customerZIP) VALUES (4, '20670');
INSERT INTO CUSTOMERS (customerID, customerZIP) VALUES (5, '20636');
INSERT INTO SALES (saleID, customerID) VALUES (1, 1);
INSERT INTO SALES (saleID, customerID) VALUES (2, 2);
INSERT INTO SALES (saleID, customerID) VALUES (3, 3);
INSERT INTO SALES (saleID, customerID) VALUES (4, 4);
INSERT INTO SALES (saleID, customerID) VALUES (5, 5);
这是我写的 SQL 查询:
SELECT C.customerZip, COUNT (*) AS "MOST_SALES_byZIP"
FROM SALES S
INNER JOIN CUSTOMERS C
ON S.customerID = C.customerID
GROUP BY C.customerZip
HAVING COUNT (*) >= ALL
(SELECT COUNT(*)
FROM SALES S
INNER JOIN CUSTOMERS C
ON S.customerID = C.customerID
GROUP BY C.customerZip)
ORDER BY C.customerZip;
基本上,我首先需要知道如何将其“转换”为 PL/SQL 匿名块。然后,我需要知道如何将结果限制为仅显示最低数字邮政编码(如果两个或更多之间存在平局)。
如果有帮助,我在这里构建了一个 SQL 小提琴模式:http://sqlfiddle.com/#!4/ca18bf/2
谢谢!
【问题讨论】:
-
你想让 PL/SQL 块做什么?
-
与我编写的标准 SQL 查询基本相同,但增加了在出现平局时将结果限制为最低数字邮政编码的功能。我知道上面的查询可以正常工作,但有人要求我通过 PL/SQL 完成此操作,但我真的不知道如何。
-
所以你希望它返回一个引用光标吗?也不会有任何平局,因为您已经按邮政编码分组。您可以使用
fetch first n子句限制整个结果集。 -
这是我迷路的地方,因为我还不太了解 PL/SQL 的语法。就目前而言,与标准 SQL 语句有一个联系(请参阅 SQL fiddle 链接以获取示例)。您能否提供一个示例来说明您将如何完成此操作,以便我了解您的想法?对不起我的无知...
-
要求通过 PL/SQL 完成?谁让你通过 PL/SQL 来做的,为什么?这在普通 SQL 中很容易,如果您需要 PL/SQL 中的结果,它仍然应该使用最有效的 SQL 查询来获取值并将其传递给 PL/SQL;在 PS/SQL 中执行正确属于 SQL 的任务的那些部分是错误的、错误的、错误的。