减少oracle PL/SQL语句

减少oracle PL/SQL语句,sql,oracle,Sql,Oracle,我是PL/SQL方面的新手。经过几个小时的学习,我有一些 我有几个奇怪的问题。示例我有一个SQL语句,如下所示: SELECT ShipperName, OrderID, NumberOfOrders, ... FROM Orders 我们是否可以声明一个包含“列表选择”的变量,比如list\u select='ShipperName,OrderID,NumberOfOrders,…' 然后用声明的“列表选择”替换select语句 SELECT list_select FROM Order

我是PL/SQL方面的新手。经过几个小时的学习,我有一些 我有几个奇怪的问题。示例我有一个SQL语句,如下所示:

SELECT ShipperName, OrderID, NumberOfOrders, ... 
FROM Orders
我们是否可以声明一个包含“列表选择”的变量,比如
list\u select='ShipperName,OrderID,NumberOfOrders,…'
然后用声明的“列表选择”替换select语句

SELECT list_select 
FROM Orders
还有另外一个问题,我们是否可以像图片一样减少SQL语句。我曾在OracleSQLDeveloper中尝试过这个,编译器还可以,但当我运行测试时,我得到了一个错误“按段”


我们非常感谢您的帮助

对于第一个问题,您可以搜索用于动态查询执行的“executeimmediate”语句。所以你可以试试下面的方法-

EXECUTE IMMEDIATE 'SELECT ' || YOUR_COMMA_DELIMITED_COLUMNS_LIST || ' FROM Orders';

对于第二个问题,请发布示例数据和预期结果。

对于第一个问题,您可以搜索用于动态查询执行的“立即执行”语句。所以你可以试试下面的方法-

EXECUTE IMMEDIATE 'SELECT ' || YOUR_COMMA_DELIMITED_COLUMNS_LIST || ' FROM Orders';

对于第二个问题,请发布示例数据和预期结果。

对于第二个问题:您不希望在此处加入,因为您仅从表1中选择。您希望
[NOT]存在
[NOT]在
中。例如:

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'
  )
);

对于第二个问题:这里不需要联接,因为您只从表1中进行选择。您希望
[NOT]存在
[NOT]在
中。例如:

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'
  )
);

请不要将代码作为图像发布。请参阅此处了解更多详细信息为什么:请每次回答一个问题。这应该是两个请求:第一个是关于动态SQL的请求(可以用PL/SQL解决,如Ankit Bajpai的回答所示)。第二个是关于如何在SQL中优化查询的问题(如我在回答中所回答的)。如果您有两个问题,请在单独的帖子中提出两个问题。StackOverflow上的线程应该包含一个问题和(理想情况下)一个可接受的答案。这个帖子有两个独立的答案,一个用于你发布的每个问题。您不能同时接受这两种格式。请不要将代码作为图像发布。请参阅此处了解更多详细信息为什么:请每次回答一个问题。这应该是两个请求:第一个是关于动态SQL的请求(可以用PL/SQL解决,如Ankit Bajpai的回答所示)。第二个是关于如何在SQL中优化查询的问题(如我在回答中所回答的)。如果您有两个问题,请在单独的帖子中提出两个问题。StackOverflow上的线程应该包含一个问题和(理想情况下)一个可接受的答案。这个帖子有两个独立的答案,一个用于你发布的每个问题。你不能两者都接受。