Mysql sql检查行是否是另一个表的子集
你能帮我解决问题吗?我有一个TBL产品,这是一个生产贴花物品的材料清单。tblStock是库存中可用的贴花。我需要一个查询,以检查哪些产品可以根据可用的贴花制造。只有在所有贴花可用的情况下才能生产该产品。非常感谢您的光临 TBL产品Mysql sql检查行是否是另一个表的子集,mysql,sql,ms-access,Mysql,Sql,Ms Access,你能帮我解决问题吗?我有一个TBL产品,这是一个生产贴花物品的材料清单。tblStock是库存中可用的贴花。我需要一个查询,以检查哪些产品可以根据可用的贴花制造。只有在所有贴花可用的情况下才能生产该产品。非常感谢您的光临 TBL产品 Id decal_1 decal_2 decal_3 1 111 121 144 2 104 106
Id decal_1 decal_2 decal_3
1 111 121 144
2 104 106 144
3 121 144 163
4 122 144 163
5 (null) 163 191
6 104 121 163
tblStock
Available_decal
111
121
144
163
191
期望输出
Id
1
3
5
请注意,数字5中有一个空值。这使事情变得复杂检查中的
应该这样做
SELECT
*
FROM
tblProduct
WHERE
(decal_1 IS NULL OR decal_1 IN (SELECT Available_decal FROM tblStock))
AND (decal_2 IS NULL OR decal_2 IN (SELECT Available_decal FROM tblStock))
AND (decal_3 IS NULL OR decal_3 IN (SELECT Available_decal FROM tblStock))
存在另一种使用的方法
:
SELECT
*
FROM
tblProduct
WHERE
(decal_1 IS NULL OR EXISTS (SELECT 1 FROM tblStock WHERE Available_decal = decal_1))
AND (decal_2 IS NULL OR EXISTS (SELECT 1 FROM tblStock WHERE Available_decal = decal_2))
AND (decal_3 IS NULL OR EXISTS (SELECT 1 FROM tblStock WHERE Available_decal = decal_3))
请与我们分享您尝试构建的sql查询。一旦您开始向列添加数字,这通常表明您的数据模型是错误的。产品中可能应该有一个单独的表,其中包含每个所需的贴花的单独行。这意味着产品5只需要两行,而且现在很容易,如果某个产品需要第四个贴花的话。它还使这个查询易于编写,因为它现在只是一个关系除法。@Damien我同意,表需要规范化。不过,这是一个遗留数据库。谢谢,这将起作用,但我忘了提到一些字段有空值。您将如何处理此问题?@Kriadidarma我更新了有关您额外请求的查询。非常好且简单的解决方案。谢谢。哪一个更快?“IN”解决方案或“EXISTS”解决方案?根据EXISTS
中的公认答案,速度更快:)惊人。谢谢你的帮助