2013-06-17 2 views
-2

В настоящее время у меня есть два разных запроса для модуля в приложении, которое я только начал поддерживать (первое задание на программирование). Первый запрос выбирает все автомобили, в которых находится Двигатель (9,10,11,12,13). Второй получает все автомобили, в которых находится Двигатель (4,44). Они оба работают нормально, единственная проблема заключается в том, что когда они помещаются в одну и ту же таблицу на JSP, они не используют один и тот же фильтр. Поэтому в основном все данные для первого запроса всегда будут первыми, а данные для второго запроса всегда будут вторыми. При сортировке по алфавиту, он будет сортировать все данные из первого запроса, AZ, то данные из второго запроса, AZ, так что вы бы увидеть что-то вроде:Как сделать JOIN внутри CASE? Или использовать СОЮЗ? (SQL)

A Car with Engine 11 
B Car with Engine 9 
C Car with Engine 13 
D Car with Engine 12 
A Car with Engine 44 
B Car with Engine 44 
C Car with Engine 4 

Так что я подумал, что это, вероятно, будет лучше всего делать какую-то комбинацию CASE и JOIN и просто иметь один запрос. К сожалению, мне трудно понять, как это сделать. Данные извлекаются из представлений в базе данных Oracle. Ниже приведены два запроса:

SELECT DISTINCT 
P.CAR_ID CAR_ID, 
P.TYPE TYPE, 
P.LAST_TIME_SERVICED LAST_TIME_SERVICED, 
P.SERVICE_TYPE SERVICE_TYPE, 
P.PURCHASE_DATE PURCHASE_DATE, 
'20'|| SUBSTR (P.MODEL_YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (P.MODEL_YEAR, 3, 4)   MODEL_YEAR, 
P.DESCRIPTION DESCRIPTION, 
P.ENGINE_TYPE ENGINE_TYPE, 
V.MODEL_ID MODEL_ID, 
V.POPULAR_NAME POPULAR_NAME, 
V.GMC GMC, 
V.DISPUTE DISPUTE, 
V.ENGINE ENGINE, 
'20'|| SUBSTR (V.YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (V.YEAR, 3, 4) YEAR, 
DECODE (V.SUBS, '~', NULL, V.SUBS) SUBS, 
V.CONSEC CONSEC, 
RFI.CUST_CUST_ID CUST_CUST_ID, 
RFI.SALESMAN SALESMAN 
    FROM DEALER.VW_INV_FOR_SALE RFI, DEALER.VW_OLD_SALES P, 
    DEALER.VW_NEW_SALES V 
     WHERE P.ENGINE_TYPE IN (9,10,11,12,13) 
     AND V.MODEL_ID = RFI.MODEL_ID 
     AND RFI.MODEL_ID = P.MODEL_ID 
     AND V.YEAR >='1011' 
     AND V.YEAR = P.MODEL_YEAR 
     AND V.ENGINE = P.ENGINE_TYPE 
     AND V.SUBS = P.SUBSCRIPT 
     AND P.DESCRIPTION != '100% SAFE' 
     AND RFI.CUST_CUST_ID IN (SELECT CUST_ID FROM CUSTOMERS WHERE CUST_ID = ? 
      UNION 
      SELECT CUST_ID FROM CUSTOMERS 
      START WITH CUST_CUST_ID = ? 
      CONNECT BY PRIOR CUST_ID = CUST_CUST_ID) 

SELECT DISTINCT 
P.CAR_ID CAR_ID, 
P.TYPE TYPE, 
P.LAST_TIME_SERVICED LAST_TIME_SERVICED, 
P.SERVICE_TYPE SERVICE_TYPE, 
P.PURCHASE_DATE PURCHASE_DATE, 
'20'|| SUBSTR (P.MODEL_YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (P.MODEL_YEAR, 3, 4) MODEL_YEAR, 
RFI.CUST_CUST_ID CUST_CUST_ID, 
RFI.SALESMAN SALESMAN, 
P.DESCRIPTION DESCRIPTION, 
P.ENGINE_TYPE ENGINE_TYPE, 
Q.MODEL_ID MODEL_ID, 
Q.POPULAR_NAME POPULAR_NAME, 
Q.GMC GMC, 
Q.DISPUTE DISPUTE, 
Q.ENGINE ENGINE, 
'20'|| SUBSTR (Q.YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (Q.YEAR, 3, 4) YEAR, 
DECODE (Q.SUBS, '~', NULL, Q.SUBS) SUBS, 
Q.CONSEC CONSEC, 
Q.RESULT RESULT 
    FROM DEALER.VW_INV_FOR_SALE RFI, DEALER.VW_OLD_SALES P, 
    DEALER.VW_ENGINE4_RESULT Q 
     WHERE P.ENGINE_TYPE IN (4,44) 
     AND Q.MODEL_ID = RFI.MODEL_ID 
     AND RFI.MODEL_ID = P.MODEL_ID 
     AND Q.YEAR >='1011' 
     AND Q.YEAR = P.MODEL_YEAR 
     AND Q.ENGINE = P.ENGINE_TYPE 
     AND Q.SUBS = P.SUBSCRIPT 
     AND P.DESCRIPTION != '100% SAFE' 
     AND RFI.CUST_CUST_ID IN (SELECT CUST_ID FROM CUSTOMERS WHERE CUST_ID = ? 
      UNION 
      SELECT CUST_ID FROM CUSTOMERS 
      START WITH CUST_CUST_ID = ? 
      CONNECT BY PRIOR CUST_ID = CUST_CUST_ID) 

Любая помощь с этим очень ценится.

+3

Это действительно трудно следовать ур длительных запросов с проблемой, упомянутой. Можете ли вы упростить ур вопрос с образцом запроса для решения только проблемы ур сталкивается. то есть что-то вроде i hv 2 таблицы A и B. Мне нужны данные из A, которые не находятся в B. –

+0

Помимо типов двигателей, как эти запросы отличаются? –

ответ

0

Наименее навязчивым способом добиться этого было бы просто UNION для обоих запросов, а затем применить ORDER BY для сортировки столбцов. Единственная проблема заключается в том, что UNION требует, чтобы все столбцы в обоих запросах совпадали. Поскольку у вас есть столбцы в одном запросе, которые не находятся в другом, они должны быть заменены заполнителем (как правило, NULL).

Так что-то вроде этого:

(SELECT DISTINCT 
    P.CAR_ID CAR_ID, 
    P.TYPE TYPE, 
    P.LAST_TIME_SERVICED LAST_TIME_SERVICED, 
    P.SERVICE_TYPE SERVICE_TYPE, 
    P.PURCHASE_DATE PURCHASE_DATE, 
    '20'|| SUBSTR (P.MODEL_YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (P.MODEL_YEAR, 3, 4) MODEL_YEAR, 
    NULL, 
    NULL, 
    P.DESCRIPTION DESCRIPTION, 
    P.ENGINE_TYPE ENGINE_TYPE, 
    V.MODEL_ID MODEL_ID, 
    V.POPULAR_NAME POPULAR_NAME, 
    V.GMC GMC, 
    V.DISPUTE DISPUTE, 
    V.ENGINE ENGINE, 
    '20'|| SUBSTR (V.YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (V.YEAR, 3, 4) YEAR, 
    DECODE (V.SUBS, '~', NULL, V.SUBS) SUBS, 
    V.CONSEC CONSEC, 
    RFI.CUST_CUST_ID CUST_CUST_ID, 
    RFI.SALESMAN SALESMAN 
FROM DEALER.VW_INV_FOR_SALE RFI, DEALER.VW_OLD_SALES P, 
    DEALER.VW_NEW_SALES V 
WHERE P.ENGINE_TYPE IN (9,10,11,12,13) 
    AND V.MODEL_ID = RFI.MODEL_ID 
    AND RFI.MODEL_ID = P.MODEL_ID 
    AND V.YEAR >='1011' 
    AND V.YEAR = P.MODEL_YEAR 
    AND V.ENGINE = P.ENGINE_TYPE 
    AND V.SUBS = P.SUBSCRIPT 
    AND P.DESCRIPTION != '100% SAFE' 
    AND RFI.CUST_CUST_ID IN (SELECT CUST_ID FROM CUSTOMERS WHERE CUST_ID = ? 
           UNION 
          SELECT CUST_ID FROM CUSTOMERS 
            START WITH CUST_CUST_ID = ? 
            CONNECT BY PRIOR CUST_ID = CUST_CUST_ID) 
UNION 
SELECT DISTINCT 
    P.CAR_ID CAR_ID, 
    P.TYPE TYPE, 
    P.LAST_TIME_SERVICED LAST_TIME_SERVICED, 
    P.SERVICE_TYPE SERVICE_TYPE, 
    P.PURCHASE_DATE PURCHASE_DATE, 
    '20'|| SUBSTR (P.MODEL_YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (P.MODEL_YEAR, 3, 4) MODEL_YEAR, 
    RFI.CUST_CUST_ID CUST_CUST_ID, 
    RFI.SALESMAN SALESMAN, 
    P.DESCRIPTION DESCRIPTION, 
    P.ENGINE_TYPE ENGINE_TYPE, 
    Q.MODEL_ID MODEL_ID, 
    Q.POPULAR_NAME POPULAR_NAME, 
    Q.GMC GMC, 
    Q.DISPUTE DISPUTE, 
    Q.ENGINE ENGINE, 
    '20'|| SUBSTR (Q.YEAR, 1, 2)|| ' - '|| '20'|| SUBSTR (Q.YEAR, 3, 4) YEAR, 
    DECODE (Q.SUBS, '~', NULL, Q.SUBS) SUBS, 
    Q.CONSEC CONSEC, 
    NULL, 
    Q.RESULT RESULT 
FROM DEALER.VW_INV_FOR_SALE RFI, DEALER.VW_OLD_SALES P, 
    DEALER.VW_ENGINE4_RESULT Q 
WHERE P.ENGINE_TYPE IN (4,44) 
    AND Q.MODEL_ID = RFI.MODEL_ID 
    AND RFI.MODEL_ID = P.MODEL_ID 
    AND Q.YEAR >='1011' 
    AND Q.YEAR = P.MODEL_YEAR 
    AND Q.ENGINE = P.ENGINE_TYPE 
    AND Q.SUBS = P.SUBSCRIPT 
    AND P.DESCRIPTION != '100% SAFE' 
    AND RFI.CUST_CUST_ID IN (SELECT CUST_ID FROM CUSTOMERS WHERE CUST_ID = ? 
           UNION 
          SELECT CUST_ID FROM CUSTOMERS 
            START WITH CUST_CUST_ID = ? 
            CONNECT BY PRIOR CUST_ID = CUST_CUST_ID)) 
ORDER BY 1,2,3 
+0

Рад, что это сработало для вас! Если вы не возражаете, пожалуйста, отметьте ответ как принятый. – Joe

Смежные вопросы