2012-05-17 6 views
1

번호가 6 또는 7 인 플레이어와 같은 거리와 타운에 사는 모든 플레이어의 플레이어 번호, 이름, 거리 및 도시를 검색해야합니다.하위 쿼리가있는 SQL 쿼리

SQL 쿼리를 작성하는 방법을 잘 모르겠습니다. WHERE 절에 하위 쿼리가 있어야하지만 어떻게 처리해야하는지 알 수 없습니다.

이 내가 생각 해낸 것입니다,하지만 난이 시점에서 그것을 테스트 방법이 없습니다

SELECT playerNo, name, street, town 
FROM Players 
WHERE street IN (SELECT street, playerNo 
        FROM Players 
        WHERE playerNo IN (6,7)); 
AND town IN (SELECT town, playerNo 
      FROM Players 
      WHERE playerNo IN (6,7)); 

대답 모든 사람에게

감사 오라클 10g와 호환되어야합니다! 이 오라클, PostgreSQL을, DB2, 테라 데이타, MySQL의에서 작동 ANSI SQL 솔루션 (그리고 아마도 많은, 그래서 당신은 당신의 DBMS를 명시하지 않았다

select t.playerNumber, t.name, t.street, t.town 
from tablename t 
inner join (select street, town from tablename where playerNumber in (6,7)) aux on aux.street = t.street and aux.town = t.town 
+1

SQL Fiddle에서 쿼리를 테스트 할 수 있으므로 다음에 "테스트 할 방법이 없습니다". 예를 들어 http://sqlfiddle.com/#!4/b5ad1/1이 실행되지 않는다는 것을 알 수 있지만 아래 답변 중 하나가 해당 사항입니다. http://sqlfiddle.com/#!4/b5ad1/3 –

답변

4

이 같은

2

뭔가 트릭을 할해야 다른 사람의도) :

SELECT playerNo, name, street, town 
FROM Players 
WHERE (street, town) IN (SELECT street, town 
         FROM Players 
         WHERE playerNo IN (6,7)); 

IN 운영자에 대한 보조 노트 :

당신의 표현 town IN (SELECT town, playerNO ...은 무효입니다 때문에 subselect는 IN 연산자의 왼쪽과 정확히 동일한 수의 열이어야합니다. 귀하의 경우에는 당신은 데이터베이스 최적화 '는 괄호 안에 볼'수 없기 때문에 서브 쿼리를 방지하는 것이 최선의 town IN (SELECT town FROM ...)

+0

이것은 * 정말 * 나에게 이상한 것 같습니다. 왜'join' 안에'where'를 넣을까요? O_o –

+0

"내부"선택은 플레이어 6과 7의 거리와 마을을 가져옵니다. "외부"선택은 "내부"선택에서 주어진 거리와 도시가있는 정보를 가져옵니다. 그것은 트릭을하지만, 당신이 말했듯이 더 간단한 방법으로 가능합니다 :) –

2
SELECT p1.playerNo, p1.name, p1.street, p1.town 
FROM Players AS p1 
INNER JOIN Players AS p2 ON p2.street = p1.street AND p2.town = p1.town 
WHERE p2.playerNo IN (6,7) 

작성해야합니다.

+0

그건 좋은 솔루션입니다. (오라클이 "parens *를 볼 수 없다"는 것을 완전히 확신하지는 못했지만). –

+0

감사합니다. 오라클은 아마도 다른 많은 DB보다 더 똑똑 할 것입니다. 내가 자주 서브 쿼리를 리팩토링하여 다른 시스템에서 일들을 시작했다는 것을 알고있다. 대부분 한 달 안에 읽을 수있는 것이 더 중요합니다. – Andrew