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
'programing' 카테고리의 다른 글
JAXB: 마샬이 가치를 창출하는 방법 (0) | 2023.09.14 |
---|---|
어린이를 조롱하는 구성 요소 - 각도 2 (0) | 2023.09.14 |
MySQL regex에서 캡처 그룹을 어떻게 참조합니까? (0) | 2023.09.14 |
관리자가 로그인한 후 우커머스가 재정의되지 않음 (0) | 2023.09.14 |
WordPress로 NextJS에서 네비게이션 메뉴를 관리하는 방법 (0) | 2023.09.14 |