我有这3张桌子:
产品表
ID
网站ID
optionsSet 表
ID
的productId
...
选项表
ID
optionsSetId
代码
...
问题:
如何通过了解以下两项来强制选择选项表中的所有的SQL查询: option.code 和产品.siteId ?
我知道如何在两个表上使用JOIN进行查询,但我正在努力加入这三个表。
答案 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个数据库相关联?
如果要包含第三个表结果,可以在该表上添加另一个连接以获得所需的条件。