programing

SQL - Union of Selects inside Where...인절

muds 2023. 9. 14. 00:00
반응형

SQL - Union of Selects inside Where...인절

(처음 여기에 글을 올리는 것은 어리석은 일이 아니길 바랍니다.글 읽기 싫으면 그냥 코드 읽기만 하면 돼, 간단한 코드 구조 질문이니까, 아마)

그래서 오늘 저는 어떤 배우들이 특정 배우와 같은 장면에 출연하는지(영화 데이터베이스의 맥락에서) 알 수 있는 질문을 해야 했습니다.표의 세부사항을 명시하는 것은 중요하지 않다고 생각합니다. (그러나 그들이 있다면 게시할 수 있습니다.)

제 쿼리를 작성하는 동안, 저는 먼저 두 쿼리의 결과 연합(장면이 속한 대본의 ID와 해당 대본 내부의 장면 순서를 알려준 것)을 수행하고 그 장면에서 모든 배우를 선택해야 한다는 것을 깨달았습니다.장면은 액션 파트와 스피치 라인으로 나뉘며, 액터는 액션 파트에만 연결되고 장면에는 직접 연결되지 않습니다.

저는 이미 효과가 있는 답변을 가지고 있습니다. (저는 여전히 다른 조합을 해야 하지만 그것은 간단합니다.) 하지만 저는 그것이 왜 효과가 있는지, 그리고 제 첫 번째 답변이 왜 효과가 없는지 이해하고 싶습니다.제가 한 것은 괄호를 제거하는 것뿐이었습니다.

그래서 이 대답은 통하지 않습니다.

Select Distinct name
From Staff S
Inner join MChar_ActPart MCAP on S.stid=MCAP.aid
Where (sid, sord) in ((Select Distinct sid, sord
                       From MChar_SpLine MCSL
                       Inner join Staff S on MCSL.aid = S.stid
                       Where name = 'John Idle')                     
                      Union 
                      (Select Distinct sid, sord
                       From MChar_ActPart MCAP
                       Inner join Staff S on MCAP.aid = S.stid
                       Where name = 'John Idle'))
And name != 'John Idle';

저는 이 오류가 납니다."SQL 오류(1064):SQL 구문에 오류가 있습니다. MariaDB 서버 버전에 해당하는 매뉴얼에서 'Union' 근처에서 사용할 올바른 구문을 확인하십시오(Distinct sid, sordFrom MChar_ActPart MCAPinner join Staff S를 9행에서 선택하십시오).

하지만 이 제품은 효과가 있습니다.

Select Distinct name
From Staff S
Inner join MChar_ActPart MCAP on S.stid=MCAP.aid
Where (sid, sord) in (Select Distinct sid, sord
                      From MChar_SpLine MCSL
                      Inner join Staff S on MCSL.aid = S.stid
                      Where name = 'John Idle'
                      Union 
                      Select Distinct sid, sord
                      From MChar_ActPart MCAP
                      Inner join Staff S on MCAP.aid = S.stid
                      Where name = 'John Idle')
And name != 'John Idle';

다른 것은 괄호 뿐입니다.왜 한 명은 일하고 다른 한 명은 일하지 않습니까?

union그리고.select distinct 과 같이 합니다.다음과 같이 쿼리를 작성할 것을 강력히 권합니다.

Select Distinct name
From Staff S Inner join
     MChar_ActPart MCAP 
     on S.stid = MCAP.aid
Where ((sid, sord) in (Select sid, sord
                       From MChar_SpLine MCSL Inner Join
                            Staff S
                            on MCSL.aid = S.stid
                       Where name = 'John Idle'
                      ) or
       (sid, sord) in (Select sid, sord
                       From MChar_ActPart MCAP Inner Join
                            Staff S
                            on MCAP.aid = S.stid
                       Where name = 'John Idle'
                      )
      ) and
      name <> 'John Idle';

이 버전을 최적화할 수 있는 범위가 훨씬 더 많습니다.

((SELECT ...) UNION (SELECT ...)을 수행할 때 발생하는 오류는 MariaDB의 버그와 관련된 것입니다.

이 링크에서 버그 상태를 확인할 수 있습니다: https://jira.mariadb.org/browse/MDEV-10028

참고: 이 내용을 답변으로 추가합니다. 제 생각에는 귀하가 직면한 특정 오류에 대한 올바른 답변인 것 같습니다.

2*아악.

WHERE (a,b) ...최적화되지 않았습니다. 피하십시오.

IN ( SELECT ... )이제는 최적화된 경우가 많습니다. 피하십시오.

'derived subquery'를 사용하여 쿼리를 뒤집으면 두 개의 오우치를 모두 피할 수 있습니다.

SELECT ...
    FROM ( ( SELECT sid, sord FROM ... )
           UNION ALL  -- or DISTICT
           ( SELECT sid, sord FROM ... )
         ) AS u
    JOIN ... AS x
        ON x.sid = u.sid
       AND x.sord = u.sord
    ...

ReferenceURL : https://stackoverflow.com/questions/41134283/sql-union-of-selects-inside-where-in-clauses

반응형