Как получить несоединенные данные из данных таблиц? (Постгрес SQL)

у меня есть products table как тип product_id int с ограничением первичного ключа

имя продукта varchar с ненулевым ограничением

пример данных, как показано ниже

1.  100, 'Nokia'
2.  200, 'IPhone'
3.  300, 'Samsung'
4.  400, 'LG'

у меня есть sales table как

SALE_ID с типом int,

PRODUCT_ID со ссылкой на таблицу продуктов типа int (ключ foregin)

YEAR с типом int

Количество с типом int

PRICE с типом int проверить цену > 0

пример данных, как показано ниже

 1, 100, 2010, 25, 5000
 2, 100, 2011, 16, 5000
 3, 100, 2012, 8,  5000
 4, 200, 2010, 10, 9000
 5, 200, 2011, 15, 9000
 6, 200, 2012, 20, 9000
 7, 300, 2010, 20, 7000
 8, 300, 2011, 18, 7000
 9, 300, 2012, 20, 7000

Запрос Как найти товары, которые не проданы?


person 09Q71AO534    schedule 22.07.2013    source источник
comment
у нас есть какие-нибудь функции!! я новичок в PostgreSQL!! извините, если это не считается сомнением!   -  person 09Q71AO534    schedule 22.07.2013
comment
Я не думаю, что вы можете получить данные, которых нет. Мне одному кажется, что это противоречие?   -  person    schedule 22.07.2013
comment
@ H2CO3 извините, это ошибка ... я хочу спросить, как я могу получить продукты, которые не продаются   -  person 09Q71AO534    schedule 22.07.2013
comment
@user2561626 user2561626 Задавая вопросы по SO, постарайтесь показать хотя бы некоторые попытки решения проблемы. SO не для решения проблем за вас, а для того, чтобы помочь вам решить их самостоятельно.   -  person Ihor Romanchenko    schedule 22.07.2013
comment
@IgorRomanchenko спасибо :-) что подсказал хороший способ..   -  person 09Q71AO534    schedule 22.07.2013


Ответы (2)


@Правин

Ваше решение немного неверно, потому что в продажах no NOT NULL constraint on product_id. Он создает список, а затем фильтрует список, но список может содержать NULL, а 2 NOT IN (1, NULL) равно NULL, что в WHERE рассматривается как ложное.

Гораздо лучше перефразировать это как

WHERE NOT EXISTS (SELECT 1 FROM sales s WHERE s.product_id = products.product_id)

Запрос ::

select * 
from products 
WHERE NOT EXISTS (SELECT 1
                     FROM sales s WHERE s.product_id = products.product_id);

@игор-романченко

person 09Q71AO534    schedule 23.07.2013
comment
здорово. Это идеальная акция .. Мой +1 - person Praveen Prasannan; 23.07.2013

person    schedule
comment
@Игорь. будет ли удаление отдельного иметь какое-либо значение? - person Praveen Prasannan; 22.07.2013
comment
@Praveen Это не изменит результаты запроса, но может ускорить его. - person Ihor Romanchenko; 22.07.2013
comment
@Praveen Также полезно добавить WHERE PRODUCT_ID IS NOT NULL во внутренний запрос. В настоящее время, если какой-либо PRODUCT_ID в таблице sales равен null, весь запрос не вернет результатов. - person Ihor Romanchenko; 22.07.2013
comment
Отлично .. Обновил ответ. Спасибо за информацию о спектакле. - person Praveen Prasannan; 22.07.2013