减少oracle PL/SQL语句
Posted
技术标签:
【中文标题】减少oracle PL/SQL语句【英文标题】:Reduce the oracle PL/SQL statement 【发布时间】:2020-02-14 14:46:54 【问题描述】:我是 PL/SQL 的新手。经过几个小时的学习,我有一些 我有几个好奇的问题。示例我有一个这样的 SQL 语句:
SELECT ShipperName, OrderID, NumberOfOrders, ...
FROM Orders
我们可以声明一个变量来保存“列表选择”,比如list_select = 'ShipperName, OrderID, NumberOfOrders, ... '
然后用我们声明的“list select”替换select语句?
SELECT list_select
FROM Orders
还有其他问题,我们可以减少像 Image 这样的 SQL 语句吗?我在 Oracle SQL Developer 中尝试过,编译器没问题,但是当我运行测试时,“按段”出现错误。
感谢任何帮助并感谢您的帮助。
【问题讨论】:
请不要将代码发布为图片。请参阅此处了解更多详细信息原因:meta.***.com/questions/285551 请一次提出一个问题。这应该是两个请求:第一个关于动态 SQL(可以使用 PL/SQL 解决,如 Ankit Bajpai 的回答所示)。第二个关于如何优化 SQL 中的查询(如我的回答中所回答)。 如果您有两个问题,请分别提出 两个问题。 *** 上的一个线程应该包含一个问题和(理想情况下)一个接受的答案。该线程有两个单独的答案,一个针对您发布的每个问题。你不能同时接受它们。 【参考方案1】:对于您的第一个问题,您可以搜索用于动态查询执行的“EXECUTE IMMEDIATE”语句。所以你可以试试下面的 -
EXECUTE IMMEDIATE 'SELECT ' || YOUR_COMMA_DELIMITED_COLUMNS_LIST || ' FROM Orders';
对于第二个,请发布示例数据和预期结果。
【讨论】:
【参考方案2】:对于您的第二个问题:您不想在这里加入,因为您只从 table1 中选择。你宁愿想要[NOT] EXISTS
或[NOT] IN
。例如:
SELECT orderid, clientid
FROM orders o
WHERE EXISTS -- We are looking for orders containing expensive items
(
SELECT null
FROM orderposition op
WHERE op.orderid = o.orderid
AND op.price > 1000
)
AND -- and the client ...
(
NOT EXISTS -- ... must have paid all their invoices (there exists no unpaid invoice)
(
SELECT null
FROM invoices i
WHERE i.clientid = o.clientid
AND i.paid_date IS NULL
)
OR clientid IN -- ... or be known as reliable client (they are in the set of reliable ones)
(
SELECT c.clientid
FROM clients c
WHERE c.reliable = 'YES'
)
);
【讨论】:
以上是关于减少oracle PL/SQL语句的主要内容,如果未能解决你的问题,请参考以下文章