2010-10-13 1 views
1

Я нашел решение этого вопроса, но в случае, если один из столбцов является подзапросом, как я могу включить его в группу, или мне нужно включить его в группу. Я буду вставлять запрос здесь.ORA-00979: не выражение GROUP BY?

SELECT s.customerid, s.denomid, 
     (SELECT su.quantity 
     FROM stockupdations su 
     WHERE s.customerid = su.custid 
     AND s.denomid = su.denomid 
     AND s.curid = su.curid) AS cur_stock, c.name AS cus_name, d.denomname AS denom, 
     cur.curcode AS currency 
FROM stock s 
LEFT JOIN customers c 
ON  s.customerid = c.custid 
LEFT JOIN denomination d 
ON  d.denomid = s.denomid 
LEFT JOIN currency cur 
ON  cur.curid = s.curid 
GROUP BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode 
ORDER BY s.customerid ASC 
+1

Почему вы используете 'GROUP BY', когда вы не используете никаких агрегатных функций (например как 'SUM',' COUNT')? Что вы пытаетесь достичь? Пожалуйста, напишите ввод/ожидаемый вывод. – shahkalpesh

+0

@shahkalpesh: результат такой же, как при использовании 'DISTINCT', просто больше ввода - см. [AskTom для получения дополнительной информации] (http://asktom.oracle.com/pls/asktom/f?p=100:11: 0 :::: P11_QUESTION_ID: 32961403234212). Наличие предложения GROUP BY не требует использования агрегатных функций. –

ответ

0

Как насчет утверждения WITH?

WITH tmp AS 
(
    SELECT s.customerid, s.denomid, 
      c.name AS cus_name, 
      d.denomname AS denom, 
      cur.curcode AS currency 
    FROM stock s 
    LEFT JOIN customers c 
    ON  s.customerid = c.custid 
    LEFT JOIN denomination d 
    ON  d.denomid = s.denomid 
    LEFT JOIN currency cur 
    ON  cur.curid = s.curid 
    GROUP BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode 
    ORDER BY s.customerid ASC 
) 
SELECT tmp.customerid, tmp.denomid, 
     su.quantity, 
     tmp.cus_name, 
     tmp.denom, 
     tmp.currency 
FROM tmp 
INNER JOIN stockupdations su 
ON  tmp.customerid = su.custid 
AND tmp.denomid = su.denomid 
AND tmp.curid = su.curid 
+0

Подзаголовок не может быть изменен на INNER JOIN, потому что подвыбор возвращает значение null, если в таблице 'STOCKUPDATIONS' нет записей в зависимости от критериев. Это означает, что вам нужно использовать соединение OUTER. –

0

Вы можете использовать свой «внутренний запрос» в предложении from чем на select.

Скажем, у меня есть таблица КЛИЕНТА и заказ столика,

я могу иметь что-то вроде

SELECT C.CUSTOMER_ID, COUNT(T.ORDER_ID) 
FROM CUSTOMERS C 
JOIN (SELECT CUSTOMER_ID, ORDER_ID, ORDER_DATE, ORDER_STATUS FROM ORDERS O WHERE O.STATUS <> 'DECLINED') T 
ON T.CUSTOMER_ID = C.CUSTOMER ID 
GROUP BY C.CUSTOMER_ID 

(Это SQL является только примером, и я знаю, что есть более эффективные способы написать это, но Я не мог придумать ни одного другого примера сразу)

+0

Подзаголовок не может быть изменен на INNER JOIN, так как подвыбор возвращает значение null, если в таблице 'STOCKUPDATIONS' нет записей в зависимости от критериев. Это означает, что вам нужно использовать соединение OUTER. –

0

Вам не нужно делать все сразу. Попробуйте разбить свой запрос на несколько частей. Подзапросы, аналитические функции или другая сложная логика будут выглядеть как простые строки для внешнего запроса. (Не беспокойтесь о производительности, Oracle будет повторно писать и делать все, как один шаг, если это имеет смысл.)

--Step 3 
select [simple values] 
from 
(
    --Step 2 
    select [insanity] 
    from 
    (
    --Step 1 
    select [madness] 
    from 
    [impossible joins] 
) 
) 
group by [simple values]