SQL查询所有产品,包括没有描述的产品

时间:2013-06-29 12:33:24

标签: sql join conditional-statements

我有以下查询来从多个表格中获取产品ID,产品名称,价格,描述和成分。

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
TD.strDescription AS Description, GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP JOIN

     TProductsPrices TPP 
     on TP.intProductID=TPP.intProductID JOIN

     TProductsDescriptions TPD 
     on TP.intProductID=TPD.intProductID JOIN

     TDescriptions TD
     on TPD.intDescriptionID=TD.intDescriptionID JOIN

     TProductsIngredients TPI
     on TPD.intProductID=TPI.intProductID JOIN

     TRawHerbs TRH
     on TPI.intIngredientID=TRH.intRawHerbID

GROUP BY TPD.intProductID;

查询以其应有的方式查找所有产品信息,但我希望能够在结果中包含产品中的描述表中没有描述的产品(并且可能返回null或空字符串)。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

将适用的内连接更改为左外连接。像这样:

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
TD.strDescription AS Description, 
GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP JOIN

 TProductsPrices TPP 
 on TP.intProductID=TPP.intProductID 

left JOIN TProductsDescriptions TPD 
 on TP.intProductID=TPD.intProductID 

left JOIN TDescriptions TD
 on TPD.intDescriptionID=TD.intDescriptionID 

JOIN TProductsIngredients TPI
 on TPD.intProductID=TPI.intProductID 

JOIN TRawHerbs TRH
 on TPI.intIngredientID=TRH.intRawHerbID

GROUP BY TPD.intProductID;

答案 1 :(得分:0)

您已经以典型的方式构建了查询,您可以在其中拥有产品表,然后从中获取内容。要保留产品表中的所有内容,所有连接都应为left outer join s。此外,productId上的联接应该返回到原始表:

SELECT TP.intProductID AS ProductID, TP.strName AS Name, TPP.decPrice AS Price,
       TD.strDescription AS Description,
       GROUP_CONCAT( TRH.strName     SEPARATOR ', ' ) AS Ingredients 
FROM TProducts TP left outer JOIN
     TProductsPrices TPP 
     on TP.intProductID=TPP.intProductID left outer JOIN
     TProductsDescriptions TPD 
     on TP.intProductID=TPD.intProductID left outer JOIN
     TDescriptions TD
     on TPD.intDescriptionID=TD.intDescriptionID left outer JOIN
     TProductsIngredients TPI
     on TP.intProductID=TPI.intProductID left outer JOIN
     TRawHerbs TRH
     on TPI.intIngredientID=TRH.intRawHerbID
GROUP BY TPD.intProductID;

这会将所有产品保留在TProducts中,无论它们是否与其他表格匹配。

一般情况下(特别是如果你正在学习联接),我建议你坚持使用join子句中的一种from。这个结构,其中所有内容都是left outer join,表示“将所有内容保存在第一个表格中”。