我有一个正常运行的MySQL:
tblNivel1
我想知道如果只能在此查询中查询tblNivel2
,tblNivel3
,tblNivel4
和IF tblAuxTipificacao.idTipificacao <> value
{{1}}。
这样做的最佳做法是什么,或者我应该重写查询。
答案 0 :(得分:1)
这些是条件连接。当您看到需要时,请考虑Left Join
。在以下示例中,type
和proof
列显示概念有效。
当问到这个问题时,很多人认为case when
是可以理解的。但这显然不是我们所说的。
因此,重申一下,下面的证明列证明可以访问正确的表。如果需要,可以使用case when
或if
将其包装在另一个嵌套的派生表中,并限制行输出。
我可能有时间将其作为一个编辑显示一点点。
create table items
( sku varchar(20) primary key,
type varchar(20) not null
);
insert items(sku,type) values ('0101','pencil'),('0292','pen'),('0294','pen');
create table pencils
( sku varchar(20) primary key,
leadType varchar(20) not null,
color int not null,
proof int not null
-- FK not shown
);
insert pencils(sku,leadType,color,proof) values ('0101','No2',7,100);
create table pens
( sku varchar(20) primary key,
inkType varchar(20) not null,
color int not null,
erasable bool not null,
proof int not null
-- FK not shown
);
insert pens(sku,inkType,color,erasable,proof) values
('0292','Squid',2,false,200),
('0294','Shrimp',33,true,300);
select i.sku,i.type,p1.proof as PencilProof,p2.proof as PenProof
FROM items i
LEFT JOIN pencils p1 on p1.sku = i.sku and i.type = 'pencil'
LEFT JOIN pens p2 on p2.sku = i.sku and i.type = 'pen';
+------+--------+-------------+----------+
| sku | type | PencilProof | PenProof |
+------+--------+-------------+----------+
| 0101 | pencil | 100 | NULL |
| 0292 | pen | NULL | 200 |
| 0294 | pen | NULL | 300 |
+------+--------+-------------+----------+
这简化了外部包装器的输出,包括CASE / WHEN,并使用上述查询:
select sku,type,
CASE type
WHEN 'pencil' THEN PencilProof
WHEN 'pen' THEN PenProof
ELSE -1
END as Proof
from
( select i.sku,i.type,p1.proof as PencilProof,p2.proof as PenProof
FROM items i
LEFT JOIN pencils p1 on p1.sku = i.sku and i.type = 'pencil'
LEFT JOIN pens p2 on p2.sku = i.sku and i.type = 'pen'
) xDerived; -- every derived table needs a name (even if not used explicitly)
+------+--------+-------+
| sku | type | Proof |
+------+--------+-------+
| 0101 | pencil | 100 |
| 0292 | pen | 200 |
| 0294 | pen | 300 |
+------+--------+-------+