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

问题描述

enter image description here

文本到 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 返回一个布尔值,我该怎么做? 我发现 ORACLE 支持一个叫做 SUBSET 的函数

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

但我找不到 sql Server 甚至 MysqL 的等价物。我希望得到 sql Server 的答案。

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

解决方法

左连接也应该工作

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

假设上面的配方是表格,那么如果 Recipe2Recipe1 的子集,那么下面的查询将产生 0 的计数。

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

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

,

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

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
,

在 MySql 中你可以使用 ggplot(data = dat) + facet_wrap(~grp) + geom_point(aes(x = N_Genes,y = GO_Term,size = P_value)) + scale_size(range = c(4,.2)) + theme( axis.text = element_blank(),axis.title = element_blank(),axis.ticks = element_blank() ) 和聚合:

EXISTS

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

NOT EXISTS

参见demo

,

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 演示链接:

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