2013-10-09 2 views
2
  • Существует таблица Products, которая имеет p_no и p_desc.
  • Существует таблица order_details, которая имеет p_no (то же, что и выше).

мне нужна p_desc где products.p_no не в order_details.Получить описание товара, которое не соответствует заказу

Примечание: Я провел много поисков, и в результате я пришел в итоге.

-- Why would this work? 
select p_desc from products 
except 
select p_no from order_details 

-- Then, 
select p_desc from products 
where products.p_no not in order_details.p_no 

-- and finally, 
select p_desc from products 
where (p_no not in (select p_no from order_details)) 

Есть ли все это право? Мне сказали использовать except, но я не вижу, как первый оператор сравнивает свойство p_no, поэтому я предполагаю, что это неправильно.

+0

http://technet.microsoft.com/en-us/library/ms188055.aspx – Johan

+0

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

ответ

0

Самый чистый способ - использовать NOT EXISTS. Я просто ответил на аналогичный вопрос здесь:

https://dba.stackexchange.com/questions/51270/get-unmatched-rows-for-foreign-key

(. Обратите внимание, что этот ответ для MySQL, однако синтаксис T-SQL тот же)

В вашем случае этот запрос будет выглядеть следующим образом :

SELECT p_desc FROM dbo.products AS P 
WHERE (NOT EXISTS (SELECT 1 FROM dbo.order_details AS OD WHERE OD.p_no = P.p_no)); 
+0

Это не ответ. Это должен быть комментарий. ОП спросил «как работает ИСКЛЮЧЕНИЕ». – Johan

+0

Большое спасибо! Могу ли я спросить, что функция «1» находится во втором выборе? –

+0

Несмотря на то, что ваша (кажется, необоснованная) вера в ваши собственные знания, далека от того, чтобы быть «самым чистым» решением, это, скорее всего, самое худшее. См. Ответ @ Johan для решения, которое большинство считает самым чистым. – Bohemian

1

Потому что это домашнее задание Я не собираюсь описывать это.

// Зачем это работает?
выберите p_desc из продуктов
кроме
выберите p_no из order_details

См: http://technet.microsoft.com/en-us/library/ms188055.aspx
Подсказка: следующий код эквивалентен:

SELECT p.p_desc FROM products p 
LEFT JOIN order_details o ON (o.p_no = p.p_no) 
WHERE o.p_no IS NULL 

// Затем
выберите p_desc из продуктов
где products.p_no не в order_details.p_no

Это похоже на ошибку синтаксиса.

// и, наконец,
выберите p_desc из продуктов
где (p_no не в (выберите p_no из order_details))

Выглядит хорошо, и я нахожу этот самый простой для понимания.

Замечания о компании Microsoft EXCEPT
Хотя я могу видеть простоту использования аргумента, используя такой код, который будет делать это очень трудно портировать свой код на другую платформу.
Я рекомендую оставаться ближе к ядру SQL-92 и использовать форму в последнем заявлении.
Это сделает вас более всесторонним программистом и предотвратит блокировку на одной платформе, что может быть только хорошим, если говорить о перспективах работы.

С точки зрения функциональной точки кода образец A не имеет преимущества по сравнению с образцом C, оба используют одинаковое количество времени для запуска.

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