MySQL - 条件加入
MySQL - Conditional Join
我有一个正常工作的 MySQL:
SELECT
tblprocedimento.idProcedimento,
tblprocedimento.tituloProcedimento,
tblprocedimento.tipoProximoS,
tblprocedimento.numeroProximoS,
tblprocedimento.tipoProximoN,
tblprocedimento.numeroProximoN,
ap1.nomeProximo AS nomeProximoS,
ap2.nomeProximo AS nomeProximoN,
tblauxtextoprocedimento.textoProcedimento,
tblauxprocedimento.sTipificacao,
tblNivel1.nivel1,
tblNivel2.nivel2,
tblNivel3.nivel3,
tblNivel4.nivel4
FROM
tblAuxTextoProcedimento
LEFT JOIN
tblAuxProcedimento
ON
tblAuxTextoProcedimento.idTextoProcedimento = tblAuxProcedimento.sTextoProcedimento,
tblNivel4 INNER JOIN (tblNivel3
INNER JOIN (tblNivel2
INNER JOIN (tblNivel1
INNER JOIN tblAuxTipificacao
ON tblNivel1.idNivel1 = tblAuxTipificacao.sNivel1)
ON tblNivel2.idNivel2 = tblAuxTipificacao.sNivel2)
ON tblNivel3.idNivel3 = tblAuxTipificacao.sNivel3)
ON tblNivel4.idNivel4 = tblAuxTipificacao.sNivel4,
tblprocedimento,
tblauxproximo As ap1,
tblauxproximo As ap2
WHERE
ap2.idProximo = tblprocedimento.sProxN AND
ap1.idProximo = tblprocedimento.sProxS AND
tblprocedimento.idProcedimento = 1 AND
tblAuxProcedimento.sProcedimento = 1 AND
tblAuxTipificacao.idTipificacao = 130
我想知道是否可以在此查询中仅查询 tblNivel1
、tblNivel2
、tblNivel3
和 tblNivel4
IF tblAuxTipificacao.idTipificacao <> value
。
这样做的最佳做法是什么,或者我应该重写查询。
这些是条件联接。当您看到需要时,想想 Left Join
。在以下示例中,type
和 proof
列显示概念有效。
这比很多人想的要好理解 case when
... 当问题被问到的时候。但这显然不是我们正在谈论的。
因此,重申一下,下面的证明列证明可以访问正确的 table。如果需要,您可以使用 case when
或 if
将其进一步包装在另一个嵌套的派生 table 中,并限制行输出。
稍后我可能有时间将其显示为编辑。
架构
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 |
+------+--------+-------------+----------+
派生的使用table
这使用外包装简化了输出,包括 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 |
+------+--------+-------+
我有一个正常工作的 MySQL:
SELECT
tblprocedimento.idProcedimento,
tblprocedimento.tituloProcedimento,
tblprocedimento.tipoProximoS,
tblprocedimento.numeroProximoS,
tblprocedimento.tipoProximoN,
tblprocedimento.numeroProximoN,
ap1.nomeProximo AS nomeProximoS,
ap2.nomeProximo AS nomeProximoN,
tblauxtextoprocedimento.textoProcedimento,
tblauxprocedimento.sTipificacao,
tblNivel1.nivel1,
tblNivel2.nivel2,
tblNivel3.nivel3,
tblNivel4.nivel4
FROM
tblAuxTextoProcedimento
LEFT JOIN
tblAuxProcedimento
ON
tblAuxTextoProcedimento.idTextoProcedimento = tblAuxProcedimento.sTextoProcedimento,
tblNivel4 INNER JOIN (tblNivel3
INNER JOIN (tblNivel2
INNER JOIN (tblNivel1
INNER JOIN tblAuxTipificacao
ON tblNivel1.idNivel1 = tblAuxTipificacao.sNivel1)
ON tblNivel2.idNivel2 = tblAuxTipificacao.sNivel2)
ON tblNivel3.idNivel3 = tblAuxTipificacao.sNivel3)
ON tblNivel4.idNivel4 = tblAuxTipificacao.sNivel4,
tblprocedimento,
tblauxproximo As ap1,
tblauxproximo As ap2
WHERE
ap2.idProximo = tblprocedimento.sProxN AND
ap1.idProximo = tblprocedimento.sProxS AND
tblprocedimento.idProcedimento = 1 AND
tblAuxProcedimento.sProcedimento = 1 AND
tblAuxTipificacao.idTipificacao = 130
我想知道是否可以在此查询中仅查询 tblNivel1
、tblNivel2
、tblNivel3
和 tblNivel4
IF tblAuxTipificacao.idTipificacao <> value
。
这样做的最佳做法是什么,或者我应该重写查询。
这些是条件联接。当您看到需要时,想想 Left Join
。在以下示例中,type
和 proof
列显示概念有效。
这比很多人想的要好理解 case when
... 当问题被问到的时候。但这显然不是我们正在谈论的。
因此,重申一下,下面的证明列证明可以访问正确的 table。如果需要,您可以使用 case when
或 if
将其进一步包装在另一个嵌套的派生 table 中,并限制行输出。
稍后我可能有时间将其显示为编辑。
架构
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 |
+------+--------+-------------+----------+
派生的使用table
这使用外包装简化了输出,包括 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 |
+------+--------+-------+