编写条件递归 SQL 查询以查找在一个零售商中不可用但在其他零售商中可用的项目

问题描述 投票:0回答:1

表 t1 包含给定公司的那些零售商无法获得的那些产品的数据,而表 t2 包含零售商项目的主数据及其可用性状态。

我想写一个 sql 查询来找出任何零售商都没有的商品(即在表 t1 中),我们必须找到是否有任何其他零售商可以为同一家公司提供相同的商品(即在表 t2).

注意:- 对于给定的公司,有很多零售商,如果我们找到的任何商品可供超过 1 个零售商使用,那么我们将根据零售商的升序查找。

例如:-

  1. 在 t1- 零售商 a 和产品 a3 - 它在 t2 的 b 和 c 中都可用,但输出应包含零售商 b.

2.在 t1- 零售商 b 和产品 b4 - 它在 t2 的 a 和 c 中可用,但对于零售商- a 目前它的可用性不存在,因此输出应该包含零售商 c.

** 插入 SQL 脚本**

t1:-

CREATE TABLE t1 
(
    company VARCHAR(512),
    retailer    VARCHAR(512),
    product VARCHAR(512),
    availability    VARCHAR(512)
);

INSERT INTO t1 (company, retailer, product, availability) VALUES
    ('1', 'a', 'a1', '0'),
    ('1', 'a', 'a2', '0'),
    ('1', 'a', 'a3', '0'),
    ('1', 'b', 'b1', '0'),
    ('1', 'b', 'b2', '0'),
    ('1', 'b', 'b3', '0'),
    ('1', 'b', 'b4', '0'),
    ('1', 'c', 'c1', '0'),
    ('1', 'c', 'c2', '0');

t2:-

CREATE TABLE t2 
(
    company VARCHAR(512),
    retailer    VARCHAR(512),
    product VARCHAR(512),
    availability    VARCHAR(512)
);

INSERT INTO t2 (company, retailer, product, availability) VALUES
    ('1', 'a', 'a1', '0'),
    ('1', 'a', 'a2', '0'),
    ('1', 'a', 'a3', '0'),
    ('1', 'a', 'b2', '1'),
    ('1', 'a', 'b4', '0'),
    ('1', 'a', 'c1', '1'),
    ('1', 'a', 'b3', '0'),
    ('1', 'b', 'b1', '0'),
    ('1', 'b', 'b2', '0'),
    ('1', 'b', 'b3', '0'),
    ('1', 'b', 'b4', '0'),
    ('1', 'b', 'a3', '1'),
    ('1', 'b', 'c2', '1'),
    ('1', 'b', 'c1', '1'),
    ('1', 'c', 'c1', '0'),
    ('1', 'c', 'c2', '0'),
    ('1', 'c', 'a1', '1'),
    ('1', 'c', 'b2', '1'),
    ('1', 'c', 'b1', '1'),
    ('1', 'c', 'b4', '1'),
    ('1', 'c', 'a3', '1');

** 示例数据**

t1:-

公司 零售商 产品 可用性
1 a a1 0
1 a a2 0
1 a a3 0
1 b b1 0
1 b b2 0
1 b b3 0
1 b b4 0
1 c c1 0
1 c c2 0

t2:-

公司 零售商 产品 可用性
1 a a1 0
1 a a2 0
1 a a3 0
1 a b2 1
1 a b4 0
1 a c1 1
1 a b3 0
1 b b1 0
1 b b2 0
1 b b3 0
1 b b4 0
1 b a3 1
1 b c2 1
1 b c1 1
1 c c1 0
1 c c2 0
1 c a1 1
1 c b2 1
1 c b1 1
1 c b4 1
1 c a3 1

预期产出

"� 7621 �c11aa20NANA1aa30b11bb10c11bb20a11bb30a01bb40c11cc10a11cc20b1
公司 零售商 产品 可用性 corresponding_retailer 产品可用性
1 a a1 0\n"
** 我试过的**

with cte1 as (select * from t2 where availability=1) select * from cte1 left join t1 on cte1.product=t1.product
当同一产品在多个零售商处有售时,我遇到了问题,所以基本上不能一次遍历一个零售商,如果找不到则转移到其他零售商等等。

仅供参考-我的数据库支持 PostgreSQL。

请帮帮我,谢谢。

sql database postgresql join recursive-query
1个回答
0
投票
您可以

left join

t2
t1
,找到最近的匹配产品,然后
join
该产品的可用性返回结果:

select t2.*, t3.availability from ( select t.company, t.retailer, t.product, t.availability, min(t1.retailer) c_retailer from t1 t left join t2 t1 on t.product = t1.product and t1.availability::int > 0 group by t.company, t.retailer, t.product, t.availability) t2 left join t2 t3 on t3.retailer = t2.c_retailer and t2.product = t3.product order by t2.company, t2.retailer, t2.product

见小提琴

© www.soinside.com 2019 - 2024. All rights reserved.