объединить два запроса и не иметь никакого отношения - PullRequest
0 голосов
/ 25 ноября 2018

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

Вот мой запрос

SELECT * 
FROM
    (SELECT TOP 3
         Players.Player_Name AS 'HomeTeamBatsman',
         PlayerScores.Bat_Runs As 'HomeTeamRuns'        
     FROM 
         PlayerScores
     INNER JOIN
         Players ON PlayerScores.PlayerId = Players.PlayerId
     INNER JOIN
         Teams ON Players.TeamId = Teams.TeamId
     INNER JOIN
         Matches ON PlayerScores.MatchId = Matches.MatchId
     WHERE 
         (Teams.TeamId = 1)
         AND (Matches.MatchId = 1025)
     GROUP BY 
         Players.Player_Name,
         PlayerScores.Bat_Runs
     ORDER BY
         MAX(Bat_Runs) DESC) As HomeTeamBatting,
    (SELECT TOP 3
         Players.Player_Name AS 'OpponentTeamBatsman',
         PlayerScores.Bat_Runs As 'OpponentTeamRuns'     
     FROM 
         PlayerScores
     INNER JOIN
         Players ON PlayerScores.PlayerId = Players.PlayerId
     INNER JOIN
         Teams ON Players.TeamId = Teams.TeamId
     INNER JOIN
         Matches ON PlayerScores.MatchId = Matches.MatchId
     WHERE 
         (Teams.TeamId = 3)
         AND (Matches.MatchId = 1025)
     GROUP BY 
         Players.Player_Name,
         PlayerScores.Bat_Runs
     ORDER BY
         MAX(Bat_Runs) DESC) AS OpponentTeamBatting
END
go

Возвращает следующие результаты, однако я не хочу никакого отношения к этим запросам

image

Что я ожидаю:

enter image description here

1 Ответ

0 голосов
/ 25 ноября 2018

По чистой догадке, я думаю вы хотите UNION ALL:

SELECT *
FROM (
    SELECT TOP 3,
           'Home' AS Team,
           P.Player_Name AS Batsman,
           PS.Bat_Runs As Runs  
    FROM PlayerScores PS
         JOIN Players P ON PS.PlayerId = P.PlayerId
         JOIN Teams T ON P.TeamId = T.TeamId
         JOIN Matches M  ON PS.MatchId = M.MatchId
    WHERE T.TeamId = 1
    AND M.MatchId = 1025
    GROUP BY P.Player_Name,
             PS.Bat_Runs
    ORDER BY Bat_Runs DESC --As the GROUP BY is on Bat_Runs, MAX isn't needed
                           --In truth,why is there even a GROUP BY with no aggregation?
) AS Home
UNION ALL
SELECT *
FROM (
    SELECT Top 3
           'Away' AS Team,
           P.Player_Name AS Batsman,
           PS.Bat_Runs As Runs
    FROM PlayerScores PS
         JOIN Players P ON PS.PlayerId = P.PlayerId
         JOIN Teams T ON P.TeamId = T.TeamId
         JOIN Matches M  ON PS.MatchId = M.MatchId

    WHERE T.TeamId = 3
      AND Matches.MatchId = 1025
    GROUP BY P.Player_Name,
             PS.Bat_Runs
    ORDER BY Bat_Runs DESC
    ) AS Away;

Редактировать: Теперь у нас есть ожидаемый набор результатов.Я подозреваю, что GROUP BY здесь не нужен.Зачем?Ну, у ОП нет агрегации, поэтому нет смысла его там присутствовать, поэтому я удалил его.

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

WITH Home AS(
    SELECT P.Player_Name AS Batsman,
           PS.Bat_Runs As Runs,
           RANK() OVER (ORDER BY PS.Bat_Runs) AS RunsRank
    FROM PlayerScores PS
         JOIN Players P ON PS.PlayerId = P.PlayerId
         JOIN Teams T ON P.TeamId = T.TeamId
         JOIN Matches M  ON PS.MatchId = M.MatchId
    WHERE T.TeamId = 1
    AND M.MatchId = 1025),
Away AS (
    SELECT P.Player_Name AS Batsman,
           PS.Bat_Runs As Runs,
           RANK() OVER (ORDER BY PS.Bat_Runs) AS RunsRank
    FROM PlayerScores PS
         JOIN Players P ON PS.PlayerId = P.PlayerId
         JOIN Teams T ON P.TeamId = T.TeamId
         JOIN Matches M  ON PS.MatchId = M.MatchId
    WHERE T.TeamId = 3
      AND Matches.MatchId = 1025
    )
SELECT H.Batsman AS HomeBatsMan,
       H.Runs AS HomeBatsManRuns,
       A.Batsman AS AwayBatsMan,
       A.Runs AS AwayBatsManRuns
FROM Home H
     JOIN Away A ON H.RunsRank = A.RunsRank
WHERE H.RunsRank <= 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...