2009-12-18 3 views
0

Я пытаюсь внутреннее соединение 2 временных таблиц
Я знаю, что это может быть сделано, я делал это раньше, но я полностью забыл, как это сделать

Пожалуйста, посоветуйте мне
Ниже запрос, который я пытаюсь выполнить

Помощь с SQL 2005 и внутреннее соединение

select tmp1.*, tmp2.cnt from 
(
    select 
     1 as ClassificationType, 
     tblMatches.IdGame, 
     tblMatches.IdPlayer, 
     sum(Score) as Score, sum(Points) as Points, sum(OpponentScore) as OpponentScore, 
     count(ID) as MatchesCount, count(distinct IdCompetition) as CompetitionsCount 
    from 
     tblMatches 
    group by IdPlayer, IdGame 
) as tmp1 
inner join (select IdWinner, count(IdWinner) as cnt from tblCompetitions where IdWinner = tmp1.IdPlayer) as tmp2 
      on tmp2.IdWinner = tmp1.IdPlayer 

Это потерпит неудачу с
Я думаю, что я не имею право использовать tmp1 в подзапросе, которые создают tmp2

Msg 4104, Level 16, State 1, Line 17 Идентификатор из нескольких частей «tmp1.IdPlayer» не может быть связан.

ответ

3

Вы не пытаетесь присоединиться к двум временным таблицам, а двум производным таблицам.

Вы не можете получить доступ к внутренним данным одной производной таблицы вне ее, если она не находится в предложении SELECT.

Попробуйте следующее:

select tmp1.*, tmp2.cnt from 
(
    select 
     1 as ClassificationType, 
     tblMatches.IdGame, 
     tblMatches.IdPlayer, 
     sum(Score) as Score, sum(Points) as Points, sum(OpponentScore) as OpponentScore, 
     count(ID) as MatchesCount, count(distinct IdCompetition) as CompetitionsCount 
    from 
     tblMatches  
    group by IdPlayer, IdGame 
) as tmp1 
inner join (select IdWinner, count(IdWinner) as cnt from tblCompetitions GROUP BY IdWinner) as tmp2 
       on tmp2.IdWinner = tmp1.IdPlayer 
1

где положение в tmp2 дублирует условие соединения:

inner join (select IdWinner, count(IdWinner) as cnt 
      from tblCompetitions 
      where IdWinner = tmp1.IdPlayer) as tmp2 
on   tmp2.IdWinner = tmp1.IdPlayer 

Просто удалите пункт where. Кроме того, как Astander отметил в своей теперь удаляемой записи, то второй запрос нуждается в group by тоже:

inner join (select IdWinner, count(IdWinner) as cnt 
      from tblCompetitions 
      group by IdWinner) as tmp2 
on   tmp2.IdWinner = tmp1.IdPlayer 

Причина вы не можете ссылаться на внешний запрос из подзапроса, что это сделало бы правую часть join зависят от левой части соединения.

1

Вам не нужен второй подзапрос. Как насчет этого?

SELECT tmp1.ClassificationType, tmp1.IdGame, tmp1.IdPlayer, 
     COUNT(tblCompletions.IdWinner) as cnt FROM 
(
    SELECT 
     1 as ClassificationType, 
     tblMatches.IdGame, 
     tblMatches.IdPlayer, 
     sum(Score) as Score, sum(Points) as Points, sum(OpponentScore) as OpponentScore, 
     count(ID) as MatchesCount, count(distinct IdCompetition) as CompetitionsCount 
    FROM 
     tblMatches  
    GROUP BY IdPlayer, IdGame 
) as tmp1 
INNER JOIN tblCompletions ON tmp1.IdPlayer = tblCompletions.IdWinner 
GROUP BY tmp1.ClassificationType, tmp1.IdGame, tmp1.IdPlayer 
2
select 
    1 as ClassificationType, 
    tmp1.IdGame, 
    tmp1.IdPlayer, 
    sum(tmp1.Score) as Score, 
    sum(tmp1.Points) as Points, 
    sum(tmp1.OpponentScore) as OpponentScore, 
    count(tmp1.ID) as MatchesCount, 
    count(distinct tmp1.IdCompetition) as CompetitionsCount, 
    count(tmp2.IdWinner) as cnt 
from 
    tblMatches tmp1 
    inner join 
    tblCompetitions tmp2 
     on tmp2.IdWinner = tmp1.IdPlayer 
group by 
    tmp1.IdPlayer, 
    tmp1.IdGame 
Смежные вопросы