【问题标题】:How to get the data which are not soled from the given tables? (PostgreSQL)如何获取未从给定表中获取的数据? (PostgreSQL)
【发布时间】:2013-07-21 04:46:44
【问题描述】:

我有products table 作为 product_id 带主键约束的 int 类型

具有非空约束的产品名称 varchar

如下示例数据

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

我有sales table

int 类型的 SALE_ID,

产品表的int类型引用的PRODUCT_ID(外键)

整数类型的年份

int 类型的数量

PRICE with int type check price > 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

查询 如何找到未售出的产品?

【问题讨论】:

  • 我们有什么功能吗!!我是 PostgreSQL 的新手!!如果不被视为疑问,我很抱歉!
  • 我认为您不能“获取不存在的数据”。我是唯一一个觉得这是矛盾的人吗?
  • @H2CO3 对不起,这是一个错误...我的意思是问我如何才能获得未出售的产品
  • @user2561626 在 SO 上提问时,请尝试至少展示一些解决问题的尝试。 SO不是为你解决问题,而是帮你自己解决问题。
  • @IgorRomanchenko 谢谢你 :-) 给我建议一个好方法..

标签: postgresql postgresql-9.2


【解决方案1】:

@普拉文

您的解决方案有点不正确,因为销售中有 no NOT NULL constraint on product_id。它建立一个列表然后对列表进行过滤,但是该列表可能包含NULL,并且2 NOT IN (1, NULL) 为NULL,在WHERE 中被视为false。

最好把这个改成

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);

@igor-romanchenko

【讨论】:

  • 太棒了。这是一个完美的分享.. 我的 +1
【解决方案2】:
select * 
from products 
where product_id not in (select PRODUCT_ID 
                         from sales 
                         where PRODUCT_ID  is not null);

【讨论】:

  • @Igor 。删除 distinct 会有什么不同吗?
  • @Praveen 它不会改变查询的结果,但可能会更快。
  • @Praveen 另外,将WHERE PRODUCT_ID IS NOT NULL 添加到内部查询中也很有用。目前,如果sales 表中的任何PRODUCT_IDnull,则整个查询将不返回任何结果。
  • 太棒了.. 更新了答案。感谢您提供有关演出的信息。
猜你喜欢
  • 2016-10-25
  • 2023-02-01
  • 2014-09-16
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 2012-12-25
相关资源
最近更新 更多