Sql server 根据另一个表中是否存在特定行来选择列

Sql server 根据另一个表中是否存在特定行来选择列,sql-server,tsql,Sql Server,Tsql,这个问题和这个类似 但我需要更具体地说明存在哪些行 我有两张表格:“竞赛”和“竞赛项目” 比赛: ID | NAME | TYPE -------------------------------- 1 | Example | example type 2 | Another | example type 参赛作品 ID | USERID | COMPETITIONID --------------------------------- 1

这个问题和这个类似

但我需要更具体地说明存在哪些行

我有两张表格:“竞赛”和“竞赛项目”

比赛:

ID    | NAME      | TYPE
--------------------------------
1     | Example   | example type
2     | Another   | example type
参赛作品

ID    | USERID    | COMPETITIONID
---------------------------------
1     | 100       | 1
2     | 110       | 1
3     | 110       | 2
4     | 120       | 1
我想选择比赛,但添加一个附加列,指定用户是否已参加比赛。这是我当前的SELECT语句

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    (CASE 
        WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 
        ELSE 0 
        END
    ) AS 'ENTERED'      

FROM competitions AS c
LEFT OUTER JOIN competition_entries AS e
ON e.COMPETITIONID = c.ID
我将
@userid
参数设置为
110
的期望结果集如下

ID    | NAME    | TYPE         | ENTERED
-------------------------------------
1     | Example | example type | 1
2     | Another | example type | 1
但是我得到了这个

ID    | NAME    | TYPE         | ENTERED
-------------------------------------
1     | Example | example type | 0
1     | Example | example type | 1
1     | Example | example type | 0
2     | Another | example type | 1  
因为它正在计算所有用户ID的条目

修复您的查询

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    MAX(CASE 
        WHEN e.ID IS NOT NULL AND e.USERID = @userid THEN 1 
        ELSE 0 
        END
    ) AS 'ENTERED'      
FROM competitions AS c
LEFT OUTER JOIN competition_entries AS e ON e.COMPETITIONID = c.ID
GROUP BY
    c.[ID],
    c.[NAME],
    c.[TYPE]
另一种方法是使用几乎相同但更容易理解的EXISTS重写它。
顺便说一句,不推荐在列名上使用单引号。使用方括号

SELECT
    c.[ID],
    c.[NAME],
    c.[TYPE],
    CASE WHEN EXISTS (
        SELECT *
        FROM competition_entries AS e
        WHERE e.COMPETITIONID = c.ID
          AND e.USERID = @userid) THEN 1 ELSE 0 END [ENTERED]
FROM competitions AS c

是的,使用第二个就可以了,而且更容易理解,我知道这是沿着这些思路的东西。谢谢你的点名提示。