sql server—一个表的sql返回值取决于另一个表

xzlaal3s  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(265)

我有两张table- IdentificationChallenges 以及 IdentificationResults .
挑战表显示挑战列表,结果表存储用户尝试挑战的情况。
我需要一个查询来返回用户没有尝试过的所有挑战(其中用户id在结果表中不存在)。我的尝试如下:

SELECT ic.*
from IdentificationChallenges ic
LEFT JOIN IdentificationResults ir ON ic.Id = ir.ChallengeId
WHERE ir.UserId != 'cfc1d26c-c091-4b17-aaa3-31e8f5232cf9'
ORDER BY NEWID()

它不检索任何记录。知道我哪里出错了吗?
识别挑战

Id | ChallengeDateTime | ImageUrl | Description

鉴定结果

Id | ChallengeId | UserId | ChallengeResult | ResultDateTime
368yc8dk

368yc8dk1#

我会用 not exists 获取特定用户尚未完成的挑战列表。原因是,在你的加入中,你实际上在寻找 ir.UserId is null 但这不会返回与特定用户相关的列表。以下是你需要的。

DECLARE @ID UNIQUEIDENTIFIER = 'cfc1d26c-c091-4b17-aaa3-31e8f5232cf9';

SELECT IC.*
FROM dbo.IdentificationChallenges IC
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.IdentificationResults IR
    WHERE IR.ChallengeId = IC.Id
    AND IR.UserId = @ID
)
ORDER BY NEWID();
xoshrz7s

xoshrz7s2#

更新您的 WHERE 条件为 WHERE ir.UserId IS NULL . 它将返回用户没有尝试过的所有挑战。同时更新 ON 使用 ic.Id = ir.ChallengeId AND ir.UserId = 'cfc1d26c-c091-4b17-aaa3-31e8f5232cf9' 得到 challanges 尝试者 user .

SELECT ic.*
FROM IdentificationChallenges ic
LEFT JOIN IdentificationResults ir 
    ON ic.Id = ir.ChallengeId
        AND ir.UserId = 'cfc1d26c-c091-4b17-aaa3-31e8f5232cf9'
WHERE ir.UserId IS NULL
ORDER BY NEWID()
8nuwlpux

8nuwlpux3#

您必须加入该用户的结果,并使用 WHERE 检查是否未找到匹配项。

SELECT ic.*
from IdentificationChallenges ic
     LEFT JOIN IdentificationResults ir ON ic.Id = ir.ChallengeId and 
                                           ir.UserId = 'cfc1d26c-c091-4b17-aaa3-31e8f5232cf9'
WHERE ir.Id is null

ps:你为什么这么想 order by newid() 当你不在结果中返回新创建的id时?

相关问题