上下文: 加入条件存在三个固定条件值。这些条件代表产品的加入状态。我在product.productid上获得了GROUP BY,并且只会看到该特定产品的最严重的附加条件。
期望的情况:
PRODUCTID PRODUCTNAME ACCESOIRESID ACCESOIRESCONDITION
1 product1 2 defect
2 product2 3 working
3 product3 6 working
答案 0 :(得分:1)
尝试此查询:
select
a.productid ,
a.productname ,
b.accesoiresid ,
b.accesoirescondition
from product a
left join accesoires b on a.productid=b.productid
inner join
(
select d.productid, min(case
when d.accesoirescondition = 'defect'
then 1
when d.accesoirescondition = 'obsolete'
then 2
when d.accesoirescondition = 'working'
then 3
end) as severity
from accesoires d
group by d.productid
) c on b.productid = c.productid
and c.severity =
case
when b.accesoirescondition = 'defect'
then 1
when b.accesoirescondition = 'obsolete'
then 2
when b.accesoirescondition = 'working'
then 3
end
这将为您提供每种产品更严重的结果。
答案 1 :(得分:0)
我会为条件代码添加一个表而不是冗余字段,如下所示:
CREATE TABLE product (
productid int,
productname varchar(20)
);
CREATE TABLE cond (
conditionid int,
conditionname varchar(20)
);
CREATE TABLE accesoires (
accesoiresid int,
productid int,
accesoiresname varchar(20),
accesoirescondition int
);
INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');
INSERT INTO cond VALUES
(1, 'defect'),
(2, 'obsolete'),
(3, 'working');
INSERT INTO accesoires VALUES
(1, 1, 'accesoires1', 3),
(2, 1, 'accesoires2', 1),
(3, 1, 'accesoires3', 2),
(4, 2, 'accesoires4', 3),
(5, 3, 'accesoires5', 3),
(6, 3, 'accesoires6', 2);
然后你可以像这样查询:
SELECT p.productid,
p.productname,
a.accesoiresid,
c.conditionname
FROM product p
JOIN accesoires a on p.productId = a.productId
JOIN cond c on c.conditionid = a.accesoirescondition
WHERE a.accesoirescondition =
(SELECT MIN(accesoirescondition)
FROM accesoires
WHERE productId = p.productId )
结果是:
PRODUCTID PRODUCTNAME ACCESOIRESID CONDITIONNAME
1 product1 2 defect
2 product2 4 working
3 product3 6 obsolete
这看起来很像你想要的输出,期望第2行的AccesoiresId。但是永远不会与你提供的数据相比( IS 没有像在Accesoires for productid = 2)
答案 2 :(得分:0)
好的,为了达到这个目的,我会做vkamayiannis所做的事情。
但是我建议将条件存储在一个单独的表中(在我的示例中为accessoryCondition
)
下面的SQL示例
CREATE TABLE product (
productid int,
productname varchar(20)
);
CREATE TABLE accessories (
accesoiresid int,
productid int,
accesoiresname varchar(20),
conditiontype int
);
CREATE TABLE accessoryCondition (
conditiontype int,
description varchar(20)
);
INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');
INSERT INTO accessories VALUES
(1, 1, 'accesoires1', 1),
(2, 1, 'accesoires2', 3),
(3, 1, 'accesoires3', 2),
(4, 2, 'accesoires4', 1),
(5, 3, 'accesoires5', 1),
(6, 3, 'accesoires6', 2);
INSERT INTO accessoryCondition VALUES
(1, 'working'),
(3, 'defect'),
(2, 'obsolete');
希望得到你想要的SQL结果,使用JOIN
到表
select
p.productid,
p.productname,
a.accesoiresid,
AC.description
from
product p
LEFT OUTER JOIN
accessories a
ON
p.productid = a.productid
LEFT OUTER JOIN
accessoryCondition AC
ON
A.conditionType = AC.conditiontype
WHERE
AC.conditiontype IS NULL OR
AC.conditiontype =
(
select max(a2.conditiontype)
from accessories a2
where a2.productid = a.productid
)
或其他方式是使用嵌套选择,如下所示
SELECT
productid,
productname,
accesoiresid,
AC.description AS 'Condition'
FROM
(
select
p.productid,
p.productname,
a.accesoiresid,
MAX(a.conditionType) as 'HighestCondition'
from
product p
LEFT JOIN
accessories a
ON
p.productid = a.productid
LEFT JOIN
accessoryCondition AC
ON
A.conditionType = AC.conditiontype
GROUP BY
p.productid
) products
LEFT OUTER JOIN
accessoryCondition AC
ON
products.HighestCondition = AC.conditionType
答案 3 :(得分:0)
您可以尝试使用解码功能:
ORDER BY DECODE(accesoires.accesoirescondition ,'defect', 1,
'obsolete', 2,
'working', 3) ASC
答案 4 :(得分:-1)
我会在表accesoires conditiontype中添加另一个字段,它将是条件的整数represantation。这样的事情:
CREATE TABLE product (
productid int,
productname varchar(20)
);
CREATE TABLE accesoires (
accesoiresid int,
productid int,
accesoiresname varchar(20),
accesoirescondition varchar(20),
conditiontype int
);
INSERT INTO product VALUES
(1, 'product1'),
(2, 'product2'),
(3, 'product3');
INSERT INTO accesoires VALUES
(1, 1, 'accesoires1', 'working', 1),
(2, 1, 'accesoires2', 'defect', 3),
(3, 1, 'accesoires3', 'obsolete', 2),
(4, 2, 'accesoires4', 'working', 1),
(5, 3, 'accesoires5', 'working', 1),
(6, 3, 'accesoires6', 'obsolete', 2);
正如您所看到的,最糟糕的情况有更高的数字。所以我的查询就像:
select p.productid, p.productname, a.accesoiresid, a.accesoirescondition
from product p, accesoires a
where p.productid = a.productid
and a.conditiontype = (select max(a1.conditiontype)
from accesoires a1
where a1.productid = a.productid)