2

我有 3 个具有以下结构的表:

福奈西多

+-------------+--------------+----------+--------+
| codmaterial | idfornecedor | idmodelo | preco  |
+-------------+--------------+----------+--------+
|     8978998 |            0 |      234 | 2.00   |
|     8978998 |          718 |        0 | 22.00  |
|     8978998 |          578 |      201 | 222.00 |
+-------------+--------------+----------+--------+

前任

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

谢谢 :)

4

2 回答 2

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

于 2013-08-20T11:55:43.373 回答
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 JOIN 表。

WHERE 子句是检查 = 0 的内容(或者您可以检查“其他”表的 NULL)。

于 2013-08-20T12:08:27.763 回答