2010-06-06 2 views
1

У меня есть таблицы A, B, C, где A представляет элементы, которые могут иметь ноль или более подпунктов, хранящихся в C. Таблица B имеет только 2 внешних ключа для подключения A и C.Есть ли альтернативный способ написать этот запрос?

У меня есть этот запрос sql :

select * from A 
where not exists (select * from B natural join C where B.id = A.id and C.value > 10); 

Который говорит: «Дайте мне каждый элемент из таблицы А где все подпункты имеют значение меньше 10.

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

ответ

1

Есть три часто используемых способов проверить, является ли значение в одной таблице, а не другой:

  • НЕ СУЩЕСТВУЕТ
  • НЕ
  • LEFT JOIN ... WHERE ... IS NULL

Вы уже показали код для первого. Вот второе:

SELECT * 
FROM A 
WHERE id NOT IN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) 

А с левым присоединиться:

SELECT * 
FROM A 
LEFT JOIN (
    SELECT b.id 
    FROM B 
    NATURAL JOIN C 
    WHERE C.value > 10 
) BC 
ON A.id = BC.id 
WHERE BC.id IS NULL 

В зависимости от типа и версии базы данных, три различных метода могут привести к различным планам запросов с различными характеристиками.

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