Mysql sql检查行是否是另一个表的子集

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

你能帮我解决问题吗?我有一个TBL产品,这是一个生产贴花物品的材料清单。tblStock是库存中可用的贴花。我需要一个查询,以检查哪些产品可以根据可用的贴花制造。只有在所有贴花可用的情况下才能生产该产品。非常感谢您的光临

TBL产品

    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
中的公认答案,速度更快:)惊人。谢谢你的帮助