如何检查一个集合是否是 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")
但它 不起作用 。
另外,我没有使用或计划使用全文搜索,所以我需要一个解决方法。
假设上面的食谱是表格,如果 Recipe2
是 Recipe1
的子集,则以下查询将产生计数 0。
SELECT COUNT(*) AS cnt
FROM
(SELECT * FROM Recipe2
EXCEPT
SELECT * FROM Recipe1) AS x
在 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:
一个简单的方法使用 left join
和 count()
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
文本到 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")
但它 不起作用 。
另外,我没有使用或计划使用全文搜索,所以我需要一个解决方法。
假设上面的食谱是表格,如果 Recipe2
是 Recipe1
的子集,则以下查询将产生计数 0。
SELECT COUNT(*) AS cnt
FROM
(SELECT * FROM Recipe2
EXCEPT
SELECT * FROM Recipe1) AS x
在 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:
一个简单的方法使用 left join
和 count()
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