2014-12-19 5 views
2

Considerf having the following tabesSQL - EXISTS и NOT EXISTS с неравенством

Рассмотрим наличие этих двух таблиц и следующие запросы:

SELECT Product. * 
FROM Product 
WHERE EXISTS 
     (SELECT * 
     FROM Codes 
     WHERE Product.P_code <> Codes.P_code) 

И

SELECT Product. * 
FROM Product 
WHERE NOT EXISTS 
     (SELECT * 
     FROM Codes 
     WHERE Product.P_code <> Codes.P_code) 

является следующее рассуждение верно?

1. Первый запрос будет производить две записи, потому что в коде есть две строки P_code, которые не идентичны тем, что указаны в Product. 2. Подзапрос вернет две записи, но они будут устранены условием NOT в основном запросе, который будет возвращать нулевые строки.

Я не уверен, как работают рассуждения в этих запросах. Я могу легко предсказать, когда запрос распечатает 2 или 3 строки, но я не знаю, как он работает в случаях, когда он может печатать 0 или 5 строк (в зависимости от состояния EXISTS/NOT EXISTS и знака равенства/неравенства) ,

Может ли кто-нибудь уточнить это или отправить мне хорошее чтение? Спасибо!

ответ

2

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

Первый запрос вернет все строки в Product. Зачем? Потому что для каждого кода есть по крайней мере одна строка в Codes, где неравенство истинно. Например, код 'P_01' не соответствует 'P_03', поэтому существует код, который не соответствует.

Второй запрос не возвращает строк в Product. Зачем? Потому что для каждого кода продукта существует несовместимый код. Поскольку такой код существует, not exists терпит неудачу.

Я предлагаю вам придерживаться условий равенства в ваших заявлениях exists и not exists. Логика легче отслеживать и менее подвержена ошибкам.

+0

Спасибо! Мне нужно было знать причины этих запросов из-за моего окончательного экзамена, я, скорее всего, никогда не буду использовать такой формат (с признаками неравенства) на практике. –

1

EXISTS возвращает TRUE, если внутренний запрос возвращает хотя бы одну запись.

Итак, в первом запросе EXISTS возвращает TRUE для всех продуктов, потому что в CODES есть хотя бы одна запись, которая не соответствует коду продукта в PRODUCT.

Простая визуализация, приведенная ниже.

enter image description here

В противоположность этому, не существует вернуть TRUE, если ни одна строка не возвращается из внутреннего запроса. Inn выше примера нет таких ситуаций и ничего не возвращает.

Справка из oracle

+0

Перечитайте sql - запросы включают в себя неравенство, а не равенство. 'Product.P_code <> Codes.P_code' – Sonic

+0

Спасибо. Редактирование комментария – kamoor