三个表之间的SQL查询,只从一个表中获取数据

时间:2015-06-11 18:55:57

标签: sql

我有这3张桌子:

产品

  

ID

     

网站ID

optionsSet

  

ID

     

的productId

     

...

选项

  

ID

     

optionsSetId

     

代码

     

...

问题:

如何通过了解以下两项来强制选择选项表中的所有的SQL查询: option.code 产品.siteId

我知道如何在两个表上使用JOIN进行查询,但我正在努力加入这三个表。

2 个答案:

答案 0 :(得分:4)

这样的东西
SELECT
    *
FROM
    option
WHERE
    code = @code
    AND optionsSetId IN 
    (SELECT
        os.id
    FROM
        optionsSet os
        JOIN product p ON os.productId = p.Id
    WHERE
        p.siteId = @siteId)

其中@code是您的代码参数,@ siteId是您的siteid参数

要使用内部联接,您必须将所有3个表连接在一起并且希望

SELECT 
    DISTINCT o.* 
FROM
    option o
    JOIN optionsSet os ON o.optionsSetId = os.Id
    JOIN product p ON os.productId = p.Id
WHERE
    o.code = @code
    AND p.siteId = @site

如果您发现需要DISTINCT仅从option获取数据。它可能更简单,更容易理解,但效率不高。

有人可能会说的另一个选择是使用EXISTS

更令人敬畏
SELECT
    o.*
FROM
    OPTION o
WHERE
    o.code = @code
    AND EXISTS(
        SELECT
            1
        FROM
            optionsSet os
            JOIN product p ON os.productId = p.Id
        WHERE
            o.optionSetId = os.Id
            AND p.siteId = @siteId
    )

我专门使用EXISTS几年了,开始使用包含+ 1亿条记录和IN的数据库的数据库在某些情况下比EXISTS快,而在其他情况下相同。加IN代码较少。

答案 1 :(得分:0)

SELECT * FROM option
LEFT JOIN product
ON option.code = product.siteId (+)

- (+)是左外联接。这应包括option.code中的所有值以及产品中与选项中的值具有相同siteId的所有值。

我不确定你希望OptionSet如何与其他2个数据库相关联?

如果要包含第三个表结果,可以在该表上添加另一个连接以获得所需的条件。