问题描述
文本到 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
,
假设上面的配方是表格,那么如果 Recipe2
是 Recipe1
的子集,那么下面的查询将产生 0 的计数。
SELECT COUNT(*) AS cnt
FROM
(SELECT * FROM Recipe2
EXCEPT
SELECT * FROM Recipe1) AS x
见:Set Operators - EXCEPT and INTERSECT (Transact-SQL)
,一个简单的方法是使用 left join
和 count()
:
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 演示链接: