FROM Orders
WHERE snum =
( SELECT snum
FROM Orders
WHERE cnum = 2001 );
Вы можете устранить потребность в DISTINCT используя IN вместо (=),подобно этому:
SELECT onum, amt, odate
FROM Orders
WHERE snum IN
( SELECT snum
FROM Orders
WHERE cnum = 2001 );
Что случится если есть ошибка и один из порядков был акредитован к различным продавцам? Версия использующая IN будет давать вам все порядки для обоих продавцов. Нет никакого очевидного способа наблюдения за ошибкой, и поэтому сгенерированные отчеты или решения сделанные на основе этого запроса не будут содержать ошибки. Вариант использующий ( = ) , просто потерпит неудачу.
Это, по крайней мере, позволило вам узнать что имеется такая проблема.
Вы должны затем выполнять поиск неисправности, выполнив этот подзапрос отдельно и наблюдая значения которые он производит.
В принципе, если вы знаете что подзапрос должен( по логике) вывести только одно значение, вы должны использовать = .
IN является подходящим, если запрос может ограниченно производить одно или более значений, независимо от того ожидаете вы их или нет.
Предположим, мы хотим знать комиссионные всех продавцов обслуживающих заказчиков в Лондоне:
SELECT comm
FROM Salespeople
WHERE snum IN
( SELECT snum