簡體   English   中英

SQL Server子查詢返回錯誤

[英]SQL Server Subquery Return Error

當我嘗試執行語句時,出現錯誤,返回“子查詢返回的值超過1個。不允許...”,其余的您都知道。 我對子查詢不滿意,實際上有時會反復嘗試,直到我看到要收集的結果為止。 誰能向我解釋為什么返回此錯誤的問題?

我試圖返回一個人的游戲得分,然后再繼續返回同一游戲中的所有玩家。

如果數據相關,則文件位於此處: SQL文件

SELECT
 TP.intPlayerID
,TP.strLastName + ', ' + TP.strFirstName AS strPlayerName
,TG.*
,TR.intGameID
,(
    SELECT
        CASE WHEN Game.F1S1 = 10 and Game.F2S1 = 10 THEN 20 + Game.F3S1
             WHEN Game.F1S1 = 10 and Game.F2S1 < 10 THEN 10 + Game.F2S1 + Game.F2S2
             WHEN Game.F1S1 + Game.F1S2 = 10 THEN 10 + Game.F2S1
             ELSE Game.F1S1 + Game.F1S2 
             END
        +
        CASE WHEN Game.F2S1 = 10 and Game.F3S1 = 10 THEN 20 + Game.F4S1
             WHEN Game.F2S1 = 10 and Game.F3S1 < 10 THEN 10 + Game.F3S1 + Game.F3S2
             WHEN Game.F2S1 + Game.F2S2 = 10 THEN 10 + Game.F3S1
             ELSE Game.F2S1 + Game.F2S2
             END
        +
        CASE WHEN Game.F3S1 = 10 and Game.F4S1 = 10 THEN 20 + Game.F5S1
             WHEN Game.F3S1 = 10 and Game.F4S1 < 10 THEN 10 + Game.F4S1 + Game.F4S2
             WHEN Game.F3S1 + Game.F3S2 = 10 THEN 10 + Game.F4S1
             ELSE Game.F3S1 + Game.F3S2
             END
        +
        CASE WHEN Game.F4S1 = 10 and Game.F5S1 = 10 THEN 20 + Game.F6S1
             WHEN Game.F4S1 = 10 and Game.F5S1 < 10 THEN 10 + Game.F5S1 + Game.F5S2
             WHEN Game.F4S1 + Game.F4S2 = 10 THEN 10 + Game.F5S1
             ELSE Game.F4S1 + Game.F4S2
             END
        +
        CASE WHEN Game.F5S1 = 10 and Game.F6S1 = 10 THEN 20 + Game.F7S1
             WHEN Game.F5S1 = 10 and Game.F6S1 < 10 THEN 10 + Game.F6S1 + Game.F6S2
             WHEN Game.F5S1 + Game.F5S2 = 10 THEN 10 + Game.F6S1
             ELSE Game.F5S1 + Game.F5S2
             END
        +
        CASE WHEN Game.F6S1 = 10 and Game.F7S1 = 10 THEN 20 + Game.F8S1
             WHEN Game.F6S1 = 10 and Game.F7S1 < 10 THEN 10 + Game.F7S1 + Game.F7S2
             WHEN Game.F6S1 + Game.F6S2 = 10 THEN 10 + Game.F7S1
             ELSE Game.F6S1 + Game.F6S2
             END
        +
        CASE WHEN Game.F7S1 = 10 and Game.F8S1 = 10 THEN 20 + Game.F9S1
             WHEN Game.F7S1 = 10 and Game.F8S1 < 10 THEN 10 + Game.F8S1 + Game.F8S2
             WHEN Game.F7S1 + Game.F7S2 = 10 THEN 10 + Game.F8S1
             ELSE Game.F7S1 + Game.F7S2
             END
        +
        CASE WHEN Game.F8S1 = 10 and Game.F9S1 = 10 THEN 20 + Game.F10S1
             WHEN Game.F8S1 = 10 and Game.F9S1 < 10 THEN 10 + Game.F9S1 + Game.F9S2
             WHEN Game.F8S1 + Game.F8S2 = 10 THEN 10 + Game.F9S1
             ELSE Game.F8S1 + Game.F8S2
             END
        +
        CASE WHEN Game.F9S1 = 10 and Game.F10S1 = 10 THEN 20 + Game.F10S2
             WHEN Game.F9S1 = 10 and Game.F10S1 < 10 THEN 10 + Game.F10S1 + Game.F10S2
             WHEN Game.F9S1 + Game.F9S2 = 10 THEN 10 + Game.F10S1
             ELSE Game.F9S1 + Game.F9S2
             END
        +
        CASE WHEN Game.F10S1 = 10 and Game.F10S2 = 10 THEN 20 + Game.F10S3
             WHEN Game.F10S1 = 10 and Game.F10S2 < 10 THEN 10 + Game.F10S2 + Game.F10S3
             WHEN Game.F10S1 + Game.F10S2 = 10 THEN 10 + Game.F10S3
             ELSE Game.F10S1 + Game.F10S2
             END 
        AS GameScore
    FROM 
        (   
            SELECT
                TR.intGameID
                ,SUM( CASE WHEN TR.intRollIndex = 1 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F1S1
                ,SUM( CASE WHEN TR.intRollIndex = 1 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F1S2
                ,SUM( CASE WHEN TR.intRollIndex = 2 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F2S1
                ,SUM( CASE WHEN TR.intRollIndex = 2 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F2S2
                ,SUM( CASE WHEN TR.intRollIndex = 3 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F3S1
                ,SUM( CASE WHEN TR.intRollIndex = 3 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F3S2
                ,SUM( CASE WHEN TR.intRollIndex = 4 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F4S1
                ,SUM( CASE WHEN TR.intRollIndex = 4 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F4S2
                ,SUM( CASE WHEN TR.intRollIndex = 5 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F5S1
                ,SUM( CASE WHEN TR.intRollIndex = 5 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F5S2
                ,SUM( CASE WHEN TR.intRollIndex = 6 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F6S1
                ,SUM( CASE WHEN TR.intRollIndex = 6 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F6S2
                ,SUM( CASE WHEN TR.intRollIndex = 7 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F7S1
                ,SUM( CASE WHEN TR.intRollIndex = 7 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F7S2
                ,SUM( CASE WHEN TR.intRollIndex = 8 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F8S1
                ,SUM( CASE WHEN TR.intRollIndex = 8 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F8S2
                ,SUM( CASE WHEN TR.intRollIndex = 9 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F9S1
                ,SUM( CASE WHEN TR.intRollIndex = 9 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F9S2
                ,SUM( CASE WHEN TR.intRollIndex = 10 and TR.intRollNumberIndex = 1 THEN TR.intNumberOfPins ELSE 0 END ) F10S1
                ,SUM( CASE WHEN TR.intRollIndex = 10 and TR.intRollNumberIndex = 2 THEN TR.intNumberOfPins ELSE 0 END ) F10S2
                ,SUM( CASE WHEN TR.intRollIndex = 10 and TR.intRollNumberIndex = 3 THEN TR.intNumberOfPins ELSE 0 END ) F10S3
            FROM
                TRolls AS TR
            GROUP BY
                TR.intGameID ) AS Game )
FROM
     TPlayers AS TP
    ,TGames AS TG
    ,TRolls AS TR
WHERE
    TP.intPlayerID = TG.intPlayerID
    AND TG.intGameID = TR.intGameID
    AND TP.intPlayerID = 21

如果沒有表設計,調試起來會有點困難,但是從我在查詢中看到的情況來看,可能會有一些問題(再次取決於表設計)。

  1. 您的內部子查詢沒有Where語句。 因此,它將把所有游戲都歸入intGameID分組的TRolls表中; 它將返回多個游戲; 這可能是問題所在,因為在SELECT語句中使用了“游戲”子查詢,因此它應該只返回一行; 您可能需要向您的子查詢中添加WHERE子句,並可能需要另一個聯接,具體取決於您的表結構及其關系。 如果您確實需要獲取每個游戲的分數(意味着您還不知道gameID),則需要在FROM語句中(而不是在select語句中)這樣做

    SELECT TP.intPlayerID ,TP.strLastName + ', ' + TP.strFirstName AS strPlayerName ,TG.* ,TR.intGameID , Game.Gamescore FROM TPlayers AS TP ,TGames AS TG ,TRolls AS TR , (Select ... ... ) As Game WHERE ...

  2. 根據您的問題,我知道在一個游戲中您有多個玩家。 您只過濾了“ PlayerID = 21”,所以您要添加該玩家從所有游戲中獲得的所有分數-這是您真正想要的嗎? 還是您錯過了篩選特定游戲的其他條件?

您提到您不熟悉子查詢,因此這里有一個快速的經驗法則:

  • 如果在Select語句(如您的語句)中使用,則子查詢只能返回一行。 總是。
  • 如果在From語句中使用(如我的示例),它將為您帶來一個具有多行的虛擬“臨時表”,將其括在括號中並使用Alias進行標識; 然后使用給定的別名將其與From語句中的其他表聯接。
  • 如果在Where語句中使用,它應該返回一個布爾值(true或false),一個常見的例子是驗證某處是否存在信息,例如:

    WHERE EXISTS (SELECT 'X' from .... Where ....)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM