【发布时间】:2016-06-07 19:33:08
【问题描述】:
这是一个通用的 SQL 问题。我有一个查询,它从 Products 中选择所有行以及来自其他表的额外信息。问题是它是 EAV 方案,最后一个关系以某种方式颠倒并加入中断。
要求是:
- 列出所有带有组的产品
- 如果值表中的“价格”可用,请添加此信息
- 明确:如果“价格”不可用,则应该有没有价格信息的产品行
- 产品不能重复
- 另外:DISTINCT 是不可能的
我有一个使用子查询过滤值的有效查询(如下),但我需要摆脱它。我只能使用连接。
SQL Fiddle : http://sqlfiddle.com/#!15/0576b/8
create table Products (
id int primary key,
groupId int,
code varchar(100)
);
create table Groups (
id int primary key,
code varchar(100)
);
create table Values (
id int primary key,
productId int,
typeId int,
value varchar(100)
);
create table ValueTypes (
id int primary key,
name varchar(100)
);
insert into Products values (1, 1, 'P1');
insert into Products values (2, 2, 'P2');
insert into Groups values (1, 'C1');
insert into Groups values (2, 'C2');
insert into Values values (1, 1, 1, 'Aqua');
insert into Values values (2, 1, 2, '$5');
insert into ValueTypes values (1, 'Name');
insert into ValueTypes values (2, 'Price');
我的查询有效:
SELECT *
FROM Products p
INNER JOIN Groups g ON p.groupId = g.id
LEFT JOIN Values v ON v.productId = p.id AND v.typeId = (SELECT id FROM ValueTypes WHERE name = 'Price')
问题是,如何重写它以使用连接而不是子查询?
我试过了:
SELECT *
FROM Products p
INNER JOIN Groups g ON p.groupId = g.id
LEFT JOIN Values v ON v.productId = p.id
LEFT JOIN ValueTypes vt ON vt.id = v.typeId AND vt.name = 'Price'
但它返回重复的产品 P1。另一方面,INNER JOIN 省略了没有“价格”值的产品。
【问题讨论】:
-
这是 sql server 吗?数据加 1
-
PostgreSQL,但查询应该没关系。
标签: sql postgresql join