Monday, June 22, 2020

SQL - Subquery Has 'One Expression' Without Order BY


1         
PLAYER1   
MARIO     
2         
PLAYER2   
CS        
3         
PLAYER1   
MINECRAFT
4         
PLAYER1   
DOTA      
5         
PLAYER1   
STARWAR   
6         
PLAYER2   
OXENFREE  
NULL
NULL
NULL

--SQL 'ORDER BY' Not Allowed In Subquery
SELECT TOP 30 PERCENT *
FROM
    (SELECT username, COUNT(*) AS C
     FROM plays
     GROUP BY username
     ORDER BY username DESC) T

--Move The 'Order By' To Outside The Subquery
SELECT TOP 30 percent *
FROM
    (SELECT username, COUNT(*) AS c
     FROM plays
     GROUP BY username
     ) T
ORDER BY  c DESC

--Put It All Together
SELECT TOP 30
  username,
  count(*) AS n_plays
FROM plays
GROUP BY username
ORDER BY n_plays DESC;


SELECT * FROM plays
WHERE plays.username
IN (SELECT TOP 30
                username,
                COUNT(*) AS n_plays
        FROM plays
        GROUP BY username
        ORDER BY n_plays DESC
        )
--Output
--(Subquery That Should Return One Column But Is Returning Two)
--PLAYER1       4
--PLAYER2       2
--ERROR - Only one expression can be specified in the select list
--        when the subquery is not introduced with EXISTS.


--OR THE SOLUTION

SELECT * FROM plays
WHERE plays.username
IN (SELECT TOP 30
                username
                --COUNT(*) AS n_plays
        FROM plays
        GROUP BY username
        --ORDER BY n_plays DESC
        )
--PLAYER1  
--PLAYER2

--Alternative
SELECT u.*
FROM plays u JOIN
     (SELECT TOP 30 username, COUNT(*) AS n_plays
      FROM plays p
      GROUP BY p.username
      ORDER BY COUNT(*) DESC
     ) pu
ON pu.username = u.username; 

No comments:

Post a Comment