我有以下查询来从多个表格中获取产品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或空字符串)。我怎么能这样做?
答案 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
,表示“将所有内容保存在第一个表格中”。