EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리에 문제가 있으며 ON에서 외부 SELECT를 참조하는 왼쪽 조인
이것이 문제입니다.해당 유형의 쿼리를 실행할 때
SELECT field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2
AND table3.field4 = table1.field1
WHERE "some condition");
다음 오류가 발생합니다.
Unknown column 'table1.field1' in 'on clause'
반면에 이 쿼리는
SELECT field1
FROM table1
WHERE EXISTS (SELECT table2.field2, table3.field3, table3.field4
FROM table2 LEFT JOIN table3 ON table3.field3 = table2.field2
WHERE "some condition"
AND table3.field4 = table1.field1);
잘 통합니다.
가능한 대안이 있습니다. 예를 들어 외부 조인이 아닌 내부 조인, 부정적 하위 쿼리 검사(존재하지 않음), 절이 필요하지 않고 필드 목록이 다를 수 있습니다.중요한 부분은 EXIST 하위 쿼리와 표 1 참조뿐입니다.필드1은 JOIN의 ON 조건에 있습니다.
같은 결과로 여러 MySQL과 MariaDB 서버에서 사용해 보았습니다!또한 온라인과 여기 SO에서 정확히 동일한 문제를 찾으려고 시도했지만 성공하지 못했습니다.
의견 중 하나에 제시된 것처럼, 저는 실제 예시를 들어 문제를 수정합니다.
표:
CREATE TABLE `sessions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`browser` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `browsers` (
`id` int(11) NOT NULL DEFAULT '0',
`browser` varchar(255) DEFAULT NULL
)
모든 브라우저를 사용한 모든 사용자를 확보하기 위해 이 쿼리를 실행합니다.
select distinct user_id
from sessions as t1
where not exists (select t2.id, browsers.id
from sessions as t2 LEFT JOIN browsers ON t2.browser = browsers.browser
AND t2.user_id = t1.user_id
where browsers.id IS NULL);
오류 메시지가 표시됨:
Error Code : 1054
Unknown column 't1.user_id' in 'on clause'
그리고 물론 제가 원하는 출력은 사용자 목록이 있는 쿼리 결과 세트를 선택하는 것입니다.
저는 이 특정 작업에 대한 쿼리를 다시 작성하는 방법을 알고 있으므로 문제가 되지 않습니다.문제는 매우 논리적이고 좋은 SQL로 보이기 때문에 다른 작업에 대해 이 패턴으로 쿼리를 실행하는 것입니다.
제 질문은 제가 무엇을 잘못하고 있는지, 만약 그것이 버그라면 어떻게 하면 같은 쿼리 구조를 유지하는 것을 피할 수 있는지 입니다.
bug#96946을 충족했다고 생각합니다. MySQL은 JOIN ON 절에서 외부 참조를 허용하지 않습니다.
제가 잘못 알고 있는 것이 아니라면, 이는 이중 네스팅된 NOT EXISTENT 쿼리를 다시 쓴 것이며, 제 생각에는 이 문장이 MySQL에서 실제로 받아들여질 것 같습니다.
SELECT DISTINCT user_id
FROM sessions AS s1
WHERE NOT EXISTS (SELECT *
FROM browsers AS b
WHERE NOT EXISTS (SELECT *
FROM sessions s2
WHERE s1.user_id = s2.user_id AND
s2.browser = b.browser
)
);
언급URL : https://stackoverflow.com/questions/58777342/issue-with-all-mysql-select-queries-containing-exists-subquery-and-left-join-wit
'programing' 카테고리의 다른 글
동시에 여러 CSS 애니메이션 재생 (0) | 2023.11.01 |
---|---|
멀티프로세싱은 왜 numpy를 가져온 후에 하나의 코어만 사용합니까? (0) | 2023.11.01 |
XML에서 '독립 실행형' 지시는 무엇을 의미합니까? (0) | 2023.11.01 |
파일의 MySQL 로드 데이터 - 가속? (0) | 2023.11.01 |
삭제된 경우 다른 테이블에 행을 삽입하는 트리거 (0) | 2023.11.01 |