programing

EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리에 문제가 있으며 ON에서 외부 SELECT를 참조하는 왼쪽 조인

telecom 2023. 11. 1. 22:09
반응형

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

반응형