【问题标题】:Join two tables in SQL and return result set which includes null values在 SQL 中连接两个表并返回包含空值的结果集
【发布时间】:2014-05-30 13:48:29
【问题描述】:

我有投票站点,每个站点都是表格中的一行。现在在我的网络服务器上,我需要加载所有站点,并检查每个站点是否已投票(已投票意味着站点 ID 存在于其他表的行中)。

因此,如果站点 id = 5 且 site_id 5 的行存在于 callback_votes 中,则查询将把该 id 添加到 'voted',否则它将为空。

示例:

SELECT sites.*, callback_votes.site_id AS voted
FROM sites 
INNER JOIN callback_votes ON callback_votes.site_id = sites.id;

此查询有效,但是,如果我在 callback_votes 中没有任何行,则查询将不返回任何数据。我想要做的,我仍然想返回sites.*,只是为了让voted 在这种情况下为空。

这是可能的还是有其他方法可以做到这一点?

【问题讨论】:

标签: mysql sql sql-server


【解决方案1】:

您正在使用INNER JOIN,它将返回每个表中存在匹配行的行,您需要的是LEFT JOIN

使用LEFT JOIN 简单来说就是“从左表中选择所有行,右表中没有匹配的行则返回null”。

您的查询可能如下所示:

SELECT sites.*, callback_votes.site_id AS voted
FROM sites 
LEFT JOIN callback_votes ON callback_votes.site_id = sites.id;

【讨论】:

    【解决方案2】:

    如果不在callback_votes中,只需使用insted的left join从站点获取所有数据和空值

    SELECT sites.*, callback_votes.site_id AS voted
        FROM sites 
        LEFT JOIN callback_votes ON callback_votes.site_id = sites.id;
    

    【讨论】:

      【解决方案3】:

      尝试使用 LEFT JOIN

      选择站点。*,callback_votes.site_id 已投票,
      CASE WHEN ISNULL(callback_votes.site_id,'') = '' THEN 'NO' ELSE 'YES' END IS_SITE_VOTED
      从站点左加入 callback_votes ON callback_votes.site_id = sites.id;


      CASE 用于 SQL-Server,您可以将 IF 用于 MYSQL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-21
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-30
        相关资源
        最近更新 更多