2013-03-15 2 views
0

Я пытаюсь извлечь данные из двух таблиц на основе другого.SQL Присоединиться к трем таблицам

Так .. Я эти таблицы:

**tblCategory** 
CategoryID, CategoryName 

**tblProdCat** 
prodCatID, productID, categoryID 

**tblProducts** 
productID, description, price 

мне нужно соединить таблицы и найти информацию tblProdCat и tblProducts с только CategoryName доступной для меня.

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

Вы хотите, чтобы элементы и категории продуктов отображались в виде отдельных строк? –

ответ

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

Это правильный синтаксис для внутреннего соединения, которое будет держать только записи с соответствующими идентификаторами категорий строк.

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' 

Если некоторые категории Идентификаторы могут быть пропущены, и вы хотите, чтобы эти строки, то это разумно сделать 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** 
Смежные вопросы