programing

표에 없는 목록에서 값 선택

powerit 2023. 10. 25. 23:51
반응형

표에 없는 목록에서 값 선택

ID 목록이 있습니다.

(1, 2, 3, 6, 7)

그리고 테이블:

id | anothercolumn
------------------
 1 | NULL
 2 | foo
 4 | bar
 5 | NULL
 6 | NULL

내 테이블의 ID가 아닌 값을 목록에서 검색하고 싶습니다.

예상 결과:

3, 7

SELECT FREECT

나는 이런 것을 시도했습니다.

SELECT i
WHERE i IN (1, 2, 3, 6, 7)
AND i NOT IN (SELECT id FROM mytable);

그러나 이 쿼리는 올바른 MySQL 쿼리가 아닙니다(a).FROM필수).

UNION

다음과 같은 가능성도 있습니다.

SELECT i
FROM (
    SELECT 1 AS i
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 6
    UNION SELECT 7 ) AS mylistofids
LEFT JOIN mytable
ON mytable.id = i
WHERE mytable.id IS NULL;

이 방법은 효과가 있지만, ID 목록이 커지면 쿼리가 곧 커질 것입니다.

임시 테이블

ID 목록에 대한 임시 테이블을 만들 수도 있습니다.

CREATE TEMPORARY TABLE mylistofids (
    i INT
);

INSERT INTO mylistofids (i) VALUES (1), (2), (3), (6), (7);

그럼 사용해봐요.LEFT JOIN:

SELECT i
FROM mylistofids
LEFT JOIN mytable
ON mytable.id = i
WHERE mytable.id IS NULL;

이것도 가능하지만, 제 경우에는 테이블을 만들 권한이 없습니다(임시인지 아닌지).

가능한 한 가장 좋은 방법으로 이 문제를 해결할 수 있는 방법이 있습니까?

임시 테이블이 가장 좋은 솔루션이지만, 가능하지 않은 경우 상수를 선택하고 이를 결합하여 임시 테이블을 위조할 수 있습니다.

이 솔루션을 사용하면 다음 작업을 수행할 수 있습니다.

SELECT i
FROM 
(
    SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 6 UNION SELECT 7
) AS mylistofids 
LEFT JOIN mytable
ON mytable.id = i
WHERE mytable.id IS NULL;

숫자 범위를 교차 결합하여 방대한 범위의 숫자를 생성할 수도 있습니다(정수 ID를 다루고 있다고 가정).그럼 IN 절에 있는 것만 골라주세요:-

SELECT i
FROM 
(
    SELECT units.i + tens.i * 10 + hundreds.i * 100 + thousands.i * 1000 + tensthousands.i * 10000 AS i
    FROM (SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 ) AS units
    CROSS JOIN (SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 ) AS tens
    CROSS JOIN (SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 ) AS hundreds
    CROSS JOIN (SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 ) AS thousands
    CROSS JOIN (SELECT 1 AS i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0 ) AS tensthousands
) AS mylistofids 
LEFT JOIN mytable
ON mytable.id = i
WHERE mylistofids.i IN (1, 2, 3, 6, 7)
AND mytable.id IS NULL;

언급URL : https://stackoverflow.com/questions/32461970/select-values-from-a-list-that-are-not-in-a-table

반응형