用不存在的行完成表

下车

我有一个这样的表:

buyer        product        quantity
tom          skirt          2
anna         skirt          3
tom          jeans          5

distinct(product) = skirtjeans

我想要一个表,quantity = 0<buyer, product>元组对于所有可能的产品都不存在,插入另一列

因此结果将是:

buyer        product        quantity
tom          skirt          2
anna         skirt          3
tom          jeans          5
anna         jeans          0

它看起来并不复杂,但是我不知道该怎么做。

更新
我发现了一个额外的复杂性。

我的产品实际上由两个字段定义:类和产品。product可以为null,并且product字段为null时(我正在通过交叉联接进行操作),我不必丢失信息量。

所以,如果我有这个:

buyer       class       product        quantity
tom         clothes     skirt          2
anna        clothes     skirt          3
tom         clothes     jeans          5
jim         shoes       NULL           7

我会需要:

buyer       class       product        quantity
tom         clothes     skirt          2
anna        clothes     skirt          3
tom         clothes     jeans          5
anna        clothes     jeans          0
jim         shoes       NULL           7
jim         clothes     skirt          0
jim         clothes     jeans          0
tom         shoes       NULL           0
anna        shoes       NULL           0

谢谢大家,我知道我正在使事情复杂化!

戈登·利诺夫

您可以使用cross join生成买家和产品的所有可能组合。然后使用left join(或not exists)过滤掉表格中已经存在的内容:

insert into table(buyer, product, quantity)
    select b.buyer, p.product, 0
    from (select distinct buyer from table) b cross join
         (select distinct product p from table) p left join
         table t
         on t.buyer = b.buyer and t.product = p.product
    where t.buyer is null;

编辑:

如果要返回所有行的查询,则可以使用类似的方法:

    select b.buyer, p.product, coalesce(t.qty, 0) as qty
    from (select distinct buyer from table) b cross join
         (select distinct product p from table) p left join
         table t
         on t.buyer = b.buyer and t.product = p.product;

编辑二:

如果您有NULL购买者和/或产品的价值,请使用NULL安全的比较:

    select b.buyer, p.product, coalesce(t.qty, 0) as qty
    from (select distinct buyer from table) b cross join
         (select distinct product p from table) p left join
         table t
         on t.buyer is not distinct from b.buyer and
            t.product is not distinct from p.product;

(作为一个小小的注解:我真的不喜欢distinct在此结构中使用。为什么Postgres(ANSI?)赋予它如此复杂的名称?)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用不存在删除行需要1个多小时才能完成

来自分类Dev

使用不存在的表添加迁移问题

来自分类Dev

PostgreSQL创建引用不存在表的函数

来自分类Dev

表中不存在的行

来自分类Dev

检索表中不存在的行

来自分类Dev

获取表中不存在的行

来自分类Dev

正确使用不存在

来自分类Dev

Ruby:调用不存在

来自分类Dev

使用不存在的导入的RecordEditor

来自分类Dev

正确使用不存在

来自分类Dev

测试项目引用不存在

来自分类Dev

表不存在休眠

来自分类Dev

Django的:表不存在

来自分类Dev

SQL表不存在

来自分类Dev

表或视图不存在

来自分类Dev

Laravel - 表不存在

来自分类Dev

更新表以插入新行(如果不存在)

来自分类Dev

从2个表中选择条件不存在的行

来自分类Dev

MySQL获取关系表中不存在的行

来自分类Dev

mysql在表中查找引用不存在的记录的记录

来自分类Dev

如果引用不存在的表/列,则导致创建存储过程失败

来自分类Dev

创建引用不存在的表或列的SQL函数(尚未)

来自分类Dev

选择不存在的行

来自分类Dev

选择不存在的行

来自分类Dev

表不存在表名

来自分类Dev

MySQL显示一个表中存在但其他表中不存在的行

来自分类Dev

MySQL显示一个表中存在但其他表中不存在的行

来自分类Dev

LARAVEL:关系“表”不存在第1行:从“表”中选择* ^(SQL:从“表”中选择*)

来自分类Dev

不存在的表的luigi目标