programing

정수 집합이 다른 정수 집합의 부분 집합인지 확인

yoursource 2022. 11. 22. 22:25
반응형

정수 집합이 다른 정수 집합의 부분 집합인지 확인

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를 사용하여 동일한 기능을 구현하려면 어떻게 해야 합니까?

pseudo-SQL의 예로서 다음과 같은 점에 주의해 주십시오.(..., ...)또한 다음 중 하나의 열을 나타내기 위해 예약되어 있습니다.

SELECT {1001, 1003} SUBSET-OF {1001, 1003, 1005};

또는

SELECT IS_SUBSET_OF({1001, 1003}, {1001, 1003, 1005});

특별한 이유

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

이를 수행하려면 먼저 데이터를 임시 테이블에 넣은 다음 다음과 같이 쿼리를 수행합니다.

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그 후, 그것들을 카운트하고0또는1서브셋 여부에 따라 달라집니다.

언급URL : https://stackoverflow.com/questions/25015160/check-if-a-set-of-integers-is-a-subset-of-another-set-of-integers

반응형