2012-05-26 2 views
0

안녕하세요. 모두 SQL 쿼리에 문제가있어서 솔루션을 찾을 수 없습니다.두 테이블을 비교하여 누락 요소를 날짜별로 추출하십시오.

내 데이터베이스에는 Mytable1과 Mytable2라는 두 개의 테이블이 있습니다. Mytable1에는 idCalendar, idPlayer, datePlaying 및 Mytable2 열에 idPlayer 및 namePlayer 열이 있습니다.

Mytable1에서 foreach 날짜를 추출하고 싶지 않은 플레이어의 이름을 원합니다.

idCalendar|idPlayer|datePlaying

1   |  1 | 05/01/2012 
2   |  2 | 06/01/2012 
3   |  3 | 08/01/2012 
4   |  2 | 05/01/2012 

Mytable2 (포함 된 모든 선수 이름) :

idPlayer|namePlayer

1 | P1 
2 | P2 
3 | P3 
4 | P4 

내가보기를 만들 싶습니다 예를 Mytable1를 들어

은 (플레이어와 재생 날짜를 포함) 다음 결과가 표시됩니다.

ViewResult) 날짜별로 연주하지 않은 :

datePlaying | playerName

05/01/2012 | P2 
05/01/2012 | P3 
06/01/2012 | P1 
06/01/2012 | P3 
08/01/2012 | P1 
08/01/2012 | P2 

당신은 내가이 정보를 초래할 필요가 볼 수 있듯이 : - P2와 P3 재생하지 않은 2012년 5월 1일한다. - 2012 년 1 월 6 일에 P1 및 P3이 재생되지 않았습니다. - 08/01/2012에 P1 및 P2가 재생되지 않았습니다.

나는 충분히 명확 해 졌으면 좋겠다. 미리 감사드립니다.

+0

P2 DID 재생이 나를 05/01/2012에 보입니다. 이것은 단지 오타입니까? P4가 ViewResult에 전혀 표시되지 않는 이유는 무엇입니까? 마지막으로, ViewResult는 그 날짜에 플레이하지 않은 모든 플레이어와 함께 모든 단 하나의 가능한 날짜를 표시해야합니까? 아니면 Mytable1에있는 날짜 만 표시하고 있습니까? –

+0

@Jeremy Goodell이 답장을 보내 주셔서 감사합니다. 네,이 날짜에 플레이하지 않은 플레이어의 이름을 Mytable1에있는 날짜 만 표시 할 필요가 있습니다 – Tlachtga

+0

Mytable2에있는 ID가 맞습니까? P2와 P4는 모두 같은 ID를가집니다. –

답변

3

아마 이렇게 간단 할 것 같습니다.

select 
    d.datePlaying, p.namePlayer 
from 
    table2 p 
cross join 
    (select distinct datePlaying from table1) d 
left join 
    table1 t on t.idPlayer = p.idPlayer and t.datePlaying = d.datePlaying 
where 
    t.idPlayer is null 

부수적으로 플레이어가 아닌 플레이어가 경기를했다면 어떻게 될까요? 당신 wouldnt table2에 항목이 있습니다. 어떤 선수가 경기를 치러야했는지를 나타 내기 위해 세 번째 테이블이 필요하거나 신경 써야합니까? 이 날짜 테이블은 내 별칭 'd'교차 결합 테이블을 바꾸는 데 사용됩니다.

+0

정말 고맙습니다. 특히 세 번째 테이블에 대한 아이디어는 내 필요를 예상합니다. – Tlachtga

+0

@mouters : 대답에 +1. 제가 말할 수있는 한, 우리의 쿼리는 동일한 결과 세트를 반환합니다. 하나의 성능 이점이 다른 것보다 우수한지 알고 있습니까? (나는 모르겠다. 궁금하다.) –

+0

@HeadOfCatering, SMS를 통해 실행하고 실행 경로 세부 정보를 표시하지 않고 말하기 어렵다. 일반적으로 하나의 쿼리가 다른 쿼리보다 성능이 좋을 것이라고 가정하면 SQL Server 쿼리 최적화 프로그램이 잘못되었습니다.귀하의 쿼리에 대한 내 직감적 인 반응은 SQL 서버가 Hashbytes() 함수의 결과를 테이블 스캔해야한다는 것입니다. 특히 날짜 및 이름 필드를 연결했기 때문입니다. 하지만 쿼리 최적화 도구가 매번 나를 잘못 증명할 수 있다고 말했기 때문에 그들은 아마도 평등합니다 :) –

0

저는이 컴퓨터에서 데이터베이스를 편리하게 사용할 수 없으므로 지금은 테스트 할 수 없습니다. 계속 노력할 것입니다.

SELECT  DISTINCT a.datePlaying, b.playerName 
FROM  Mytable1 a 
INNER JOIN Mytable2 b 
     ON a.idPlayer = b.idPlayer 
WHERE  NOT EXISTS (
      SELECT idPlayer 
      FROM Mytable1 a2 
      WHERE a.datePlaying = a2.datePlaying) 
ORDER BY a.datePlaying 
+0

작동하지 않습니다. s – Tlachtga

+0

수정했는데 더 효과적 일 수 있습니다. –

관련 문제