2013-03-15 171 views
0

我试图从两个表中基于另一个拉数据。SQL加入3个表格

所以..我有这些表:

**tblCategory** 
CategoryID, CategoryName 

**tblProdCat** 
prodCatID, productID, categoryID 

**tblProducts** 
productID, description, price 

我需要加入的表,找到从tblProdCat和tblProducts信息只提供给我的类别名称。

SELECT tblProducts.name, 
         tblProducts.description, 
         tblProducts.price, 
         tblProducts.qtyInStock, 
         tblProducts.image, 
         tblProducts.colour, 
         tblProducts.size, 
         tblProducts.style, 
         tblProdCat.prodCatID 
        FROM 
         tblProducts, tblProdCat,tblCategory 
        WHERE tblCategory.categoryName='Pens' 
        AND tblProdCat.categoryID = tblProducts.categoryID 

我试过以上,也试过其他连接,但拉我的头发。我读过教程,只是不明白连接是如何工作的。任何人都可以帮忙吗?请..

+0

是否希望项目和产品类别在结果中显示为单独的行? – 2013-03-15 17:17:06

回答

1

您将要使用以下JOIN语法:

SELECT p.name, 
    p.description, 
    p.price, 
    p.qtyInStock, 
    p.image, 
    p.colour, 
    p.size, 
    p.style, 
    pc.prodCatID, 
    c.CategoryName 
FROM tblProducts p 
INNER JOIN tblProdCat pc 
    ON p.productID = pc.productID 
INNER JOIN tblCategory c 
    ON pc.categoryID = c.categoryID 
WHERE c.categoryName='Pens' 

我用了一个INNER JOIN每个表将返回各表之间的所有匹配的行之间。

如果您需要帮助学习JOIN语法,这里是一个很棒的visual explanation of Joins。现在

,如果你想返回所有Products它是否有一个类别,那么你可以使用一个LEFT JOIN

SELECT p.name, 
    p.description, 
    p.price, 
    p.qtyInStock, 
    p.image, 
    p.colour, 
    p.size, 
    p.style, 
    pc.prodCatID, 
    c.CategoryName 
FROM tblProducts p 
LEFT JOIN tblProdCat pc 
    ON p.productID = pc.productID 
LEFT JOIN tblCategory c 
    ON pc.categoryID = c.categoryID 
    AND c.categoryName='Pens' 
0

这是正确的语法内连接,将只保留记录具有匹配的行类别ID。

SELECT tblProducts.name, 
    tblProducts.description, 
    tblProducts.price, 
    tblProducts.qtyInStock, 
    tblProducts.image, 
    tblProducts.colour, 
    tblProducts.size, 
    tblProducts.style, 
    tblProdCat.prodCatID 

    FROM tblProducts 
    INNER JOIN tblProdCat ON tblProdCat.productId= tblProducts.productId 
    INNER JOIN tblCategory ON tblCategory ON tblCategory.categoryId = tblProdCat.categoryId 
    WHERE tblCategory.categoryName='Pens' 

如果某些类别ID可被丢失,你想那些行则谨慎地做一个LEFT JOIN:

SELECT tblProducts.name, 
    tblProducts.description, 
    tblProducts.price, 
    tblProducts.qtyInStock, 
    tblProducts.image, 
    tblProducts.colour, 
    tblProducts.size, 
    tblProducts.style, 
    tblProdCat.prodCatID 

    FROM tblProducts 
    LEFT JOIN tblProdCat ON tblProdCat.productId= tblProducts.productId 
    LEFT JOIN tblCategory ON tblCategory ON tblCategory.categoryId = tblProdCat.categoryId 
    WHERE tblCategory.categoryName='Pens' 

这将从tblProducts返回所有记录,而不管在相应的记录的存在另外两张桌子。

0
You missed to add one more condition.  
SELECT tblProducts.name, 
          tblProducts.description, 
          tblProducts.price, 
          tblProducts.qtyInStock, 
          tblProducts.image, 
          tblProducts.colour, 
          tblProducts.size, 
          tblProducts.style, 
          tblProdCat.prodCatID 
         FROM 
          tblProducts, tblProdCat,tblCategory 
         WHERE 
          tblCategory.categoryName='Pens' 
         **AND tblProdCat.categoryID = tblCategory.categoryID 
         AND tblProducts.productID = tblProdCat.productID**