MySQL - 有条件的加入

时间:2015-12-15 22:32:10

标签: mysql conditional

我有一个正常运行的MySQL:

tblNivel1

我想知道如果只能在此查询中查询tblNivel2tblNivel3tblNivel4IF tblAuxTipificacao.idTipificacao <> value {{1}}。

这样做的最佳做法是什么,或者我应该重写查询。

1 个答案:

答案 0 :(得分:1)

这些是条件连接。当您看到需要时,请考虑Left Join。在以下示例中,typeproof列显示概念有效。

当问到这个问题时,很多人认为case when是可以理解的。但这显然不是我们所说的。

因此,重申一下,下面的证明列证明可以访问正确的表。如果需要,可以使用case whenif将其包装在另一个嵌套的派生表中,并限制行输出。

我可能有时间将其作为一个编辑显示一点点。

模式

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 |
+------+--------+-------+