Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с запросом!!!  [new]
ospts
Member

Откуда:
Сообщений: 38
Доброго времени суток!

Мне нужно сделать запрос из нескольких таблиц. У самого работы с SQL мало...

Есть три таблицы: FIRMA, PROD, PARAM
В таблице FIRMA есть поля ROW_ID и NAME
В таблице PROD есть поля ROW_ID, FIRMA (связь с таблицей FIRMA) и TOVAR
И есть третья таблица с полями ROW_ID, PARFIR (связь с таблицей FIRMA) и NAME
Запрос должен выбрать наименование фирмы и товары, которая она производит, исключая те фирмы, у которых есть параметры Z и Y. Параметры бывают от A до Z. У фирм бывает один из этих параметров, несколько различных параметров, а может и вообще не быть параметров.
Я сделал выборку вот так:

SELECT FIRMA.NAME, PROD.TOVAR
FROM FIRMA
LEFT JOIN PROD on FIRMA.ROW_ID = PROD.FIRMA
LEFT JOIN PARAM on PARAM.PARFIR = FIRMA.ROW_ID
WHERE PARAM.NAME <> 'Z' and PARAM.NAME <> 'Y'
ORDER BY FIRMA.NAME

Эта выборка не берёт во внимание те фирмы, у которых вообще нет параметров...
А мне нужно выбрать все, и те у которых вообще нет параметров и те, у которых есть другие параметры отличные от 'Z' и 'Y'.

Подскажите, пожалуйста, как сделать выборку, чтобы всё учитывалось как мне нужно?
30 апр 15, 08:44    [17584805]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
ospts
Подскажите, пожалуйста, как сделать выборку, чтобы всё учитывалось как мне нужно?

WHERE PARAM.NAME <> 'Z' and PARAM.NAME <> 'Y' выполняется _после_ LEFT JOIN
И разумеется отбрасывает "те фирмы, у которых вообще нет параметров..."
30 апр 15, 08:50    [17584830]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
iap
Member

Откуда: Москва
Сообщений: 46997
ospts,

перенесите условие WHERE в ON
30 апр 15, 08:54    [17584843]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
Wilhelm Holtoff
Member

Откуда:
Сообщений: 85
Glory,

тогда может следует использовать ISNULL ?


WHERE ISNULL(PARAM.NAME,'?') <> 'Z' and ISNULL(PARAM.NAME,'?') <> 'Y'
30 апр 15, 08:57    [17584853]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
ospts
Member

Откуда:
Сообщений: 38
Я перенёс условие в ON, но тогда выбираются все фирмы, и те у которых есть параметры 'Z' и 'Y'
30 апр 15, 09:00    [17584863]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
Wilhelm Holtoff
тогда может следует использовать ISNULL ?


WHERE ISNULL(PARAM.NAME,'?') <> 'Z' and ISNULL(PARAM.NAME,'?') <> 'Y'

Лучше всего наверное вообще использовать подзапрос NOT EXISTS()
30 апр 15, 09:05    [17584882]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
SELECT FIRMA.NAME, PROD.TOVAR
FROM FIRMA
LEFT JOIN PROD on FIRMA.ROW_ID = PROD.FIRMA
WHERE NOT EXISTS(SELECT * FROM PARAM 
                 WHERE PARAM.PARFIR = FIRMA.ROW_ID
                 AND PARAM.NAME IN ('Z','Y')
                 )
ORDER BY FIRMA.NAME
30 апр 15, 09:08    [17584890]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом!!!  [new]
ospts
Member

Откуда:
Сообщений: 38
LexusR
SELECT FIRMA.NAME, PROD.TOVAR
FROM FIRMA
LEFT JOIN PROD on FIRMA.ROW_ID = PROD.FIRMA
WHERE NOT EXISTS(SELECT * FROM PARAM 
                 WHERE PARAM.PARFIR = FIRMA.ROW_ID
                 AND PARAM.NAME IN ('Z','Y')
                 )
ORDER BY FIRMA.NAME


Спасибо!!! Запрос выбрал то что нужно!

P.S. всем остальным тоже спасибо!
30 апр 15, 09:16    [17584929]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить