ВЫБЕРИТЕ внутри INSERT INTO в Oracle - PullRequest
0 голосов
/ 30 октября 2018

У меня есть эта вставка с SELECT, но она выдает ошибку и говорит, что отсутствует правильная скобка, но я не знаю, где

INSERT INTO DETALLEVENTA(Idventa, IdProducto, Cantidad, Precio_Uni, Descuento)
VALUES((SELECT IdVenta 
        FROM Venta WHERE ROWNUM = 1 
        ORDER BY IdVenta DESC), pIdProducto, pCantidad, pPrecio_Uni, pDescuento);

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Ошибка исходит от ORDER BY IdVenta DESC, который не ожидается в этот момент в выражении. Если вы используете подзапрос в предложении values, то он должен возвращать одно значение, и упорядочивание одного значения не имеет особого смысла. (Это более общее правило, чем это, хотя в некоторых местах это разрешено, но игнорируется).

Поскольку у вас, похоже, есть порядок для ROWNUM, вам все равно нужен другой уровень подзапроса:

INSERT INTO DETALLEVENTA(Idventa, IdProducto, Cantidad, Precio_Uni, Descuento)
VALUES((
  SELECT IdVenta 
  FROM (
    SELECT IdVenta 
    FROM Venta
    ORDER BY IdVenta DESC
  )
  WHERE ROWNUM = 1
  ), pIdProducto, pCantidad, pPrecio_Uni, pDescuento);

Не обращая внимания на то, что это пока что в предложении значений, если вы только что это сделали:

SELECT IdVenta 
FROM Venta
WHERE ROWNUM = 1 
ORDER BY IdVenta DESC

Затем сначала применяется фильтр rownum, а затем вы заказываете эту единственную строку, которая не имеет смысла. Строка, которую вы фактически получаете, является неопределенной - она ​​зависит от того, как оптимизатор выполняет запрос, и может варьироваться даже между вызовами одного и того же запроса.

То, что вы на самом деле хотите, это:

SELECT IdVenta 
FROM (
  SELECT IdVenta 
  FROM Venta
  ORDER BY IdVenta DESC
)
WHERE ROWNUM = 1

, где сначала упорядочивается общий набор результатов, а затем во внешнем запросе применяется фильтр rownum. Если вы сделаете это, значит, вы получите IdVenta, который вы ожидаете, тот, который заказывается последним.

Итак, вам нужно встроить тот же подзапрос в предложение values, как и его собственный подзапрос.

Возможно, есть лучшие способы сделать это; кажется, вы выполняете это внутри блока PL / SQL, поэтому вы можете выполнить этот запрос один раз и, например, сохранить его в переменной. Из 12c есть и другие способы получить «верхний» ряд. Или вы можете пропустить подзапрос и предложение values, изменив значение insert .. select, как показало @Barbaros.

0 голосов
/ 30 октября 2018

Вы можете использовать так:

INSERT INTO DETALLEVENTA(Idventa, IdProducto, Cantidad, Precio_Uni, Descuento)
SELECT *
  FROM
  (
   SELECT IdVenta,pIdProducto, pCantidad, pPrecio_Uni, pDescuento 
     FROM Venta 
    ORDER BY IdVenta DESC
   )
  WHERE ROWNUM = 1;
0 голосов
/ 30 октября 2018

Псевдоним подзапрос, который должен решить проблему

...