Как вы можете написать этот запрос? - PullRequest
1 голос
/ 17 сентября 2010

У меня есть две таблицы.Структура таблиц следующая.

TRAILERS_INVENTORY

  • TRAILER_TYPE VARCHAR2 (100)
  • TRAILER_LENGTH INT
  • TRAILER_WIDTH INT
  • YEAR_OF_MANUFACTURE INT

NEW_INVENTORY

  • NEW_INVENTORY_TYPE_ID INT,
  • TRAILER_TYPE VARCHAR2 (100),
  • TR22ILEN_L1023 * TRAILER_WIDTH INT,
  • YEAR_OF_MANUFACTURE INT

Я хочу перечислить все трейлеры, у которых нет NEW_INVENTORY_TYPE_ID.Я использую Oracle 9.2.

Один из подходов состоит в том, чтобы использовать операцию множеств по принципу

SELECT TRAILER_TYPE
 FROM TRAILERS_INVENTORY 
WHERE TRAILER_TYPE NOT IN (SELECT TRAILER_TYPE, 
                                  TRAILER_LENGTH, 
                                  TRAILER_WIDTH, 
                                  YEAR_OF_MANUFACTURE 
                             FROM TRAILERS_INVENTORY 
                           INTERSECT 
                           SELECT TRAILER_TYPE, 
                                  TRAILER_LENGTH, 
                                  TRAILER_WIDTH, 
                                  YEAR_OF_MANUFACTURE 
                             FROM NEW_INVENTORY);

ДОСТУП ЛИБО ДРУГОЙ ПОДХОД?

Ответы [ 3 ]

4 голосов
/ 17 сентября 2010

Я вижу пару вариантов

SELECT
    TRAILER_TYPE
FROM
    TRAILERS_INVENTORY
WHERE
    TRAILER_TYPE NOT IN (SELECT TRAILER_TYPE FROM NEW_INVENTORY)

Или:

SELECT
    TRAILER_TYPE
FROM
    TRAILERS_INVENTORY
LEFT JOIN
    NEW_INVENTORY
    ON (NEW_INVENTORY.TRAILER_TYPE = TRAILERS_INVENTORY.TRAILER_TYPE)
WHERE
    NEW_INVENTORY.NEW_INVENTORY_TYPE_ID IS NULL
1 голос
/ 20 сентября 2010

Итак, вопрос в том, как выполнить этот запрос, не используя операцию "set"?

Могу я спросить, почему вы не используете набор?

Все, что вы делаете вSQL основан на наборах, но если вам нужно более медленное и менее элегантное решение, вы можете уменьшить размер набора до 1 и перейти к TRAILERS_INVENTORY, используя PL / SQL.

declare
    v_exists varchar2(1 char);
begin
    for item in (select distinct trailer_type from trailers_inventory) loop
        begin
            select 'Y' into v_exists from new_inventory
            where trailer_type = item.trailer_type;
        exception
            when no_data_found then
                v_exists := null;
        end;
        if v_exists is null then
            dbms_output.put_line(item.trailer_type || ' not in ' || ' NEW_INVENTORY');
        end if;
    end loop;
end;
/

Eek!Вот почему операции над множествами - это путь.

:)

0 голосов
/ 17 сентября 2010

А как же:

SELECT 
TRAILER_TYPE, 
TRAILER_LENGTH, 
TRAILER_WIDTH, 
YEAR_OF_MANUFACTURE 
FROM TRAILERS_INVENTORY 
MINUS
SELECT 
TRAILER_TYPE, 
TRAILER_LENGTH, 
TRAILER_WIDTH, 
YEAR_OF_MANUFACTURE 
FROM NEW_INVENTORY
...