Помощь с SQL 2005 и внутренним соединением - PullRequest
0 голосов
/ 18 декабря 2009

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

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

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

Сообщение 4104, уровень 16, состояние 1, строка 17 Многоэлементный идентификатор «tmp1.IdPlayer» не может быть связан.

Ответы [ 4 ]

3 голосов
/ 18 декабря 2009

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

Вы не можете получить доступ к внутренним данным одной производной таблицы вне ее, если они не указаны в предложении 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
2 голосов
/ 18 декабря 2009
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
1 голос
/ 18 декабря 2009

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

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
1 голос
/ 18 декабря 2009

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

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

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

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

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

...