다른 SELECT의 WHERE 절에서 SELECT 사용


21

PostrgreSQL 의 libpq 위에 원격 응용 프로그램 초안을 만들었습니다 . 잘 작동하지만 응용 프로그램의 일반적인 기능을 프로파일 링했습니다. 내가 생산하는 최종 비즈니스 결과마다 40 개의 select 절 (tcpip 이상)을 호출합니다.

원격 응용 프로그램과 데이터베이스 간의 상호 작용 횟수를 최소화하도록 상기시키는 SQL-Server를 생각 나게합니다. 내 선택을 분석 한 후에 SELECT조인을 사용 하여이 수를 3 절로 줄일 수 있다고 생각 합니다. 그러나 SELECT다른 결과를 사용하는 구문을 기억하지 못합니다 SELECT.

예 :

SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'

이것은 다른 SELECT종류 일뿐입니다.

SELECT identifier FROM another_table WHERE something='something'

다음은 단순화 된 테이블 레이아웃이며 다른 item_types에 대해 여러 번 거부되었습니다 ... (3 개의 완전히 다른 유형, 따라서 최적화 된 경우 3 개의 SQL 쿼리).

table passage
  id_passage PK
  business_field_passage bytea

table item
  id_item PK
  id_passage FK
  business_field_item text

table item_detail
  id_item_detail PK
  id_item FK
  business_field_item_detail text
  image_content bytea

id_item하나 에 몇 가지가 있습니다 id_passage. 하나
에 몇 가지가 있습니다 .id_item_detailid_item

어떻게 쓰시겠습니까?
한 선택을 다른 선택으로 리디렉션하는 동작을 설명하는 이름은 무엇입니까 (있는 경우)?



7.2.1.3을 참조하고 있습니까? 서브 쿼리?
Stephane Rolland

아마도 JOIN 부분과 함께 가능할 것입니다.
dezso

답변:


30

이것이 당신이 목표로하는 것입니까? 비교중인 필드가 비교 가능한지 확인하십시오 (예 : 두 필드 모두 숫자, 텍스트, 부울 등).

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId = (SELECT someID FROM table WHERE blahblahblah)

여러 값을 기준으로 선택하려는 경우 :

SELECT * FROM Individual
INNER JOIN Publisher
ON Individual.IndividualId = Publisher.IndividualId
WHERE Individual.IndividualId IN (SELECT someID FROM table WHERE blahblahblah)

그게 똑바로 될 수 있습니까 ?? SELECT someID FROM table WHERE blahblahblah여러 레코드 가 있으면 여전히 작동 합니까? 지금 확인하겠습니다.
Stephane Rolland

어떤 쿼리가 여러 레코드를 선택하고 있습니까? 여러 레코드를 선택하는 경우 효과가 있지만 답변을 구체화하는 데 도움이되는 테이블 레이아웃을 표시 할 수 있다면 가능합니다.
화가 스파르타

1
WHERE Individual.IndividualId IN...좋아 보인다.
Stephane Rolland

10

그냥 다른 것으로 다시 쓸 수 있습니다 JOIN. 이것은 일반적으로 가장 간단하고 빠릅니다.

SELECT i.*, p.*
FROM   individual    i
JOIN   publisher     p USING (individualid)
JOIN   another_table a ON a.identifier = i.individualid
WHERE  a.something = 'something'

나는 또한 다소 단순화하고 식별자의 무료 CamelCase 철자를 사용하지 않았다.


1
예, 이거요 IN (SELECT ..) 구문이 보일 때마다 조금씩 죽습니다.
Mark Storey-Smith 12

@ MarkStorey-Smith 더 간단하고 빠르다는 것을 의미합니까? 이것은 표준 join대신 SQL 코딩 표준을 사용 하는 것입니다 in ( select...). 그런 경우에는 Erwin에 대한 좋은 대답이되어야합니다.
Stephane Rolland

1
@StephaneRolland 더 빠른지 여부는 플랫폼 및 버전에 따라 다릅니다. 예를 들어 SQL Server 2008+는 INNER JOIN 및 IN (SELECT ...) 구문에 대해 동일한 실행 계획을 생성합니다. PostgreSql에 동일하게 적용되는지 여부는 모릅니다. 성능 측면에서 IN (SELECT ...) 스타일은 저자가 SQL의 의미와 개념을 완전히 파악했는지 궁금합니다. AngrySpartan이 원래 질문에 올바르게 답변했습니다. ErwinBrandstetter는 당신이 해야 할 방법을 보여주었습니다 :).
Mark Storey-Smith

6
@ MarkStorey-Smith : JOIN이 항상 IN 조건과 같은 것은 아닙니다. 문제는 어느 것이 더 빠르지 않은가, 문제는 어느 것이 옳은가입니다.
a_horse_with_no_name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.