表 t1 包含给定公司的那些零售商无法获得的那些产品的数据,而表 t2 包含零售商项目的主数据及其可用性状态。
我想写一个 sql 查询来找出任何零售商都没有的商品(即在表 t1 中),我们必须找到是否有任何其他零售商可以为同一家公司提供相同的商品(即在表 t2).
注意:- 对于给定的公司,有很多零售商,如果我们找到的任何商品可供超过 1 个零售商使用,那么我们将根据零售商的升序查找。
例如:-
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 |
预期产出
公司 | 零售商 | 产品 | 可用性 | 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。
请帮帮我,谢谢。
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