我有3个表格,结构如下:
fornecido
+-------------+--------------+----------+--------+
| codmaterial | idfornecedor | idmodelo | preco |
+-------------+--------------+----------+--------+
| 8978998 | 0 | 234 | 2.00 |
| 8978998 | 718 | 0 | 22.00 |
| 8978998 | 578 | 201 | 222.00 |
+-------------+--------------+----------+--------+
fornecedor
+--------------+---------------------------+---------+
| idfornecedor | nome | contact |
+--------------+---------------------------+---------+
| 578 | ACAR-IMPORT.EXPORT.LD. | NULL |
| 580 | ACCESS OFFICE VB | NULL |
| 581 | ACCIOP-CONST.OBR.PUB.,LD. | NULL |
| 582 | ACCUSONIC TECHNOLOGIES | NULL |
| 583 | ACE NAVILECTRA TOME | NULL |
| 584 | ACE-ART.CIRURG.EUROPA,LD. | NULL |
| 718 | ADIHOTEL-MAQ.EQUIP.HOT.LD | NULL |
+--------------+---------------------------+---------+
莫德洛
+----------+-----------------+
| idmodelo | nome |
+----------+-----------------+
| 224 | 24TDMEJ50 |
| 140 | 259118 |
| 201 | 122AVP |
| 234 | 1YMB531002M0005 |
+----------+-----------------+
我想用fornecedor和modelo的名称而不是id来显示结果。
SELECT
fornecedor.nome, modelo.nome, preco
FROM
fornecido, fornecedor, modelo
WHERE
fornecido.codmaterial=8978998 AND condition
我尝试或导致所有可能组合的每个条件或唯一同时具有fornecedor和modelo的条件:s
我假装像:
null, 1YMB531002M0005, 2.00
ADIHOTEL-MAQ.EQUIP.HOT.LD, null, 22.00
ACAR-IMPORT.EXPORT.LD., 122AVP, 222.00
谢谢:)
答案 0 :(得分:2)
SELECT
fn.nome as FNOME, m.nome as MNOME, f.preco
FROM fornecido f left join fornecedor fn
on f.idfornecedor = fn.idfornecedor
left join modelo m on f.idmodelo =m.idmodelo
WHERE f.codmaterial=8978998
在此检查SQlFiddle http://sqlfiddle.com/#!2/251cc/5/0
供参考:
http://placeisimportant.files.wordpress.com/2013/02/sql-joins-vis-rep-1.png http://placeisimportant.files.wordpress.com/2013/02/sql-joins-vis-rep-2.png
答案 1 :(得分:2)
首先,我喜欢构建查询,以便查看表之间的关系。接下来,您将特别关注其中一个(或两个)值对于其中一个列的值为零,但显然不希望对特定条目进行硬编码。
SELECT
fn.nome,
m.nome,
f.preco
FROM
fornecido f
LEFT JOIN fornecedor fn
on f.idfornecedor = fn.idfornecedor
LEFT JOIN modelo m
on f.idmodelo = m.idmodelo
WHERE
f.codmaterial = 8978998
AND ( f.idfornecedor = 0
OR f.idmodelo = 0)
在这种情况下,您可能需要使用LEFT JOIN,因为相应的表不会有ID为0的记录要加入,并且使用INNER JOIN意味着它必须存在于连接表中。 LEFT JOIN允许“fornecido”表仍然显示记录,无论与其他LEFT JOINed表匹配。
WHERE子句检查= 0(或者你可以检查“其他”表的NULL)。