使用至少涵盖MySQL 5.5中所有可用功能的MariaDB 5.5,如何确定一组整数是否是另一个整数子集的子集?
在其他编程(非数据库)语言中,有人(例如Java)
Set<Integer> innerSet = new HashSet<>(Arrays.asList(1001, 1003));
Set<Integer> outerSet = new HashSet<>(Arrays.asList(1001, 1003, 1005));
return outerSet.containsAll(innerSet);
更加非正式的表示法:
innerSet = {1001, 1003}
outerSet = {1001, 1003, 1005}
return (innerSet is-subset-of outerSet)
请注意,内部集合和外部集合概念的值不应该是硬编码的。
如何使用MariaDB 5.5实现相同的目标?
伪SQL中的一个示例,注意(..., ...)
也保留用于表示列:
SELECT {1001, 1003} SUBSET-OF {1001, 1003, 1005};
或
SELECT IS_SUBSET_OF({1001, 1003}, {1001, 1003, 1005});
答案 0 :(得分:1)
任何特殊原因
SELECT (COUNT(tableA.column) = COUNT(tableB.column)) FROM tableA LEFT JOIN tableB ON tableA.column = tableB.column
不行吗?您必须在数据库列中同时拥有这两个集。
没有桌子,我能想到的一个令人讨厌的方法就是这样做:
SELECT (COUNT(tableA.a) = COUNT(tableB.b))
FROM (
SELECT 10 as a
UNION
SELECT 20
) as tableA
LEFT JOIN (
SELECT 10 as b
UNION
SELECT 20
UNION
SELECT 30
) as tableB ON tableA.a = tableB.b
答案 1 :(得分:1)
这可以通过先将数据放入临时表,然后对其执行查询来完成,例如:
DROP TEMPORARY TABLE inner_set;
DROP TEMPORARY TABLE outer_set;
CREATE TEMPORARY TABLE inner_set
(value INT(11) NOT NULL, INDEX(value));
CREATE TEMPORARY TABLE outer_set
(value INT(11) NOT NULL, INDEX(value));
INSERT INTO inner_set (value) VALUES (1001), (1003);
INSERT INTO outer_set (value) VALUES (1001), (1003), (1005);
SELECT
CASE
WHEN COUNT(*) > 0 THEN 0
ELSE 1
END AS is_subset_of
FROM inner_set
LEFT JOIN outer_set ON inner_set.value = outer_set.value
WHERE outer_set.value IS NULL
这里的诀窍是,inner_set
与outer_set
的加入会为NULL
生成outer_set
值,然后您可以计算这些值并返回{{1} }或0
取决于它是否是一个子集。