代码之家  ›  专栏  ›  技术社区  ›  Alan Deep

通过在特定条件下添加具有特定值的字段,从两个表中进行选择

  •  1
  • Alan Deep  · 技术社区  · 6 年前
    Table1: Students
    ID              Name        EternalToken
    200901212       Joe         xxxxxx
    200809922       David       yyyyyy
    201009122       Chris       zzzzzz
    
    Table2: Banned
    ID      StudentID
    1       200901212
    

    全部的 学生和显示一个额外字段,该字段指示学生已通过隐藏永久令牌被禁止

    SELECT * FROM Students s 
    LEFT JOIN Banned b
    ON s.ID = b.StudentID
    

    ID              Name        EternalToken    Banned
    200901212       Joe         NULL            1
    200809922       David       yyyyyy          0
    201009122       Chris       zzzzzz          0
    

    只有被取缔的学生才有资格参加考试 EternalToken = NULL

    请注意,这是我试图实现的一个例子,而不是我正在做的。 学生和被禁止只是一个例子,我知道这不是一个多对多的关系,所以我可以在一张桌子上。但是从技术上回答这个问题将帮助我实现一个灵活的解决方案。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Tim Biegeleisen    6 年前

    您可以使用以下查询:

    SELECT
        s.ID,
        s.Name,
        CASE WHEN b.StudentID IS NOT NULL THEN NULL ELSE s.EternalToken END AS EternalToken,
        CASE WHEN b.StudentID IS NULL THEN 0 ELSE 1 END AS Banned
    FROM Students s
    LEFT JOIN Banned b
        ON s.ID = b.StudentID;
    

    enter image description here

    Demo

    请注意,这与 COALESCE 函数确实如此。 合并 NULL . 以上 CASE 标记的表达式检查值是否为 无效的 ,并返回 无效的 在这种情况下,否则会显示出永恒的象征价值。

        2
  •  0
  •   Gordon Linoff    6 年前

    使用 case exists :

    SELECT s.*,
           (CASE WHEN EXISTS (SELECT 1 FROM banned b WHERE s.ID = b.StudentID)
                 THEN 1 ELSE 0
            END) as is_banned
    FROM Students s ;
    

    SELECT s.*,
           ( EXISTS (SELECT 1 FROM banned b WHERE s.ID = b.StudentID) ) as is_banned
    FROM Students s ;
    

    EXISTS LEFT JOIN 左连接 当数据中存在重复项时,将乘以行数 banned