如何检查一个集合是否是 sql 中另一个集合的子集

How to check if a set is a subset of another set in sql

文本到 DDL:

CREATE TABLE Recipe1(
    Ingredient varchar(10)
);
INSERT INTO Recipe1(Ingredient) VALUES('Flour'),('Egg'),('Sugar');
CREATE TABLE Recipe2(
    Ingredient varchar(10)
);
INSERT INTO Recipe2(Ingredient) VALUES('Egg'),('Sugar');

我想检查食谱 2 是否是食谱 1 的子集,我想要 SQL 到 return 一个布尔值,我该怎么做? 我发现 ORACLE 支持一个叫做 SUBSET:

的函数

https://docs.oracle.com/cloud/latest/big-data-discovery-cloud/BDDEQ/reql_sets_subset.htm

但我找不到 SQL 服务器甚至 MySQL 的等效项。我希望得到 SQL 服务器的答案。

我们的讲师使用了这个代码: "Recipe 1" CONTAINS("Recipe 2") 但它 不起作用 。 另外,我没有使用或计划使用全文搜索,所以我需要一个解决方法。

假设上面的食谱是表格,如果 Recipe2Recipe1 的子集,则以下查询将产生计数 0。

SELECT COUNT(*) AS cnt
FROM
(SELECT * FROM Recipe2
 EXCEPT
 SELECT * FROM Recipe1) AS x

参见:Set Operators - EXCEPT and INTERSECT (Transact-SQL)

在 MySql 中您可以使用 EXISTS 和聚合:

SELECT MIN(EXISTS (SELECT 1 FROM Recipe1 r1 WHERE r1.col1 = r2.col2)) AS is_subset
FROM Recipe2 r2

NOT EXISTS:

SELECT NOT EXISTS (
         SELECT 1 FROM Recipe2 r2 
         WHERE NOT EXISTS (SELECT 1 FROM Recipe1 r1 WHERE r1.col1 = r2.col2)
       ) is_subset

参见demo

左连接也应该有效

Select count(*) ct 
from Recipe2 r2 
left join Recipe1 r1 on r2.Ingredient = r1.Ingredient
where r1.Ingredient is null

MS SQL 服务器:

您可以在如下情况下使用 Join 和 Case。

SELECT CASE WHEN COUNT(R1.C1)=COUNT(R2.C1) THEN '1' 
ELSE '0' END AS IS_SUBSET
FROM (VALUES ('Flour'),('Egg'),('Sugar'))R1(C1)
RIGHT JOIN (VALUES ('Egg'),('Sugar'))R2(C1)
ON R1.C1=R2.C1

SQL Fiddle 演示 link:

http://sqlfiddle.com/#!18/9eecb/107092/0

一个简单的方法使用 left joincount()s:

select (count(*) = count(r2.id)) as is_subset
from recipe1 r1
left join recipe2 r2 on t1.id = t.id

这适用于以某种方式支持布尔值的数据库(例如 MySQL)。一种更便携的方法在外部查询中使用 case

select case when count(*) = count(r2.id) then 1 else 0 end as is_subset
from recipe1 r1
left join recipe2 r2 on t1.id = t.id