반응형
표에 없는 목록에서 값 선택
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
반응형
'programing' 카테고리의 다른 글
panda - 데이터 프레임을 다른 데이터 프레임 단위로 행 요소 단위로 필터링합니다. (0) | 2023.10.25 |
---|---|
Oracle Database Express Edition 11g 설치 문제 (0) | 2023.10.25 |
jQuery Waypoints 오류:스틱 메서드가 없습니다. (0) | 2023.10.25 |
내 보기 컨트롤러의 iOS 7 시차 효과 (0) | 2023.10.25 |
앱을 시작할 때 'npm start'와 'node app.js'의 차이점은? (0) | 2023.10.25 |