SQL从两个表中选择以在SELECT语句中设置变量

SQL从两个表中选择以在SELECT语句中设置变量,sql,sqlite,Sql,Sqlite,我有两张桌子: 警报{id,title,description} 读取警报{alert\u id} 我想执行一个返回以下内容的sql: 警报{id,title,description,is_read} 已读需要为1或0。1如果在读取警报中设置了id,则0否则 在一个sql查询中实现这一点的最佳方法是什么 我正在使用Sqlite我将使用select子句中的子查询来处理此问题: select a.* (case when exists (select 1 from read_alert

我有两张桌子:

警报{id,title,description}

读取警报{alert\u id}

我想执行一个返回以下内容的sql:

警报{id,title,description,is_read}

已读
需要为
1
0
。1如果在
读取警报中设置了id,则0否则

在一个sql查询中实现这一点的最佳方法是什么


我正在使用Sqlite

我将使用
select
子句中的子查询来处理此问题:

select a.*
       (case when exists (select 1 from read_alerts ra where ra.alert_id = a.id)
             then 1 else 0
        end) as is_read
from alerts a;

select
子句中使用子查询的关键原因是,您没有指定
read\u alerts
是否可以有多行。此版本的查询保证每个警报一行,无论
read\u alerts

的内容如何,我将使用
select
子句中的子查询来处理此问题:

select a.*
       (case when exists (select 1 from read_alerts ra where ra.alert_id = a.id)
             then 1 else 0
        end) as is_read
from alerts a;

select
子句中使用子查询的关键原因是,您没有指定
read\u alerts
是否可以有多行。此版本的查询保证每个警报一行,而不管
read\u alerts

的内容如何,这可以通过外部联接完成:

SELECT a.id,
       a.title,
       a.description,
       ra.id IS NOT NULL AS is_read
FROM alerts AS a
LEFT JOIN read_alerts AS ra on a.id = ra.alert_id;
或使用相关子查询:

SELECT id,
       title,
       description,
       EXISTS (SELECT 1
               FROM read_alerts
               WHERE alert_id = alerts.id
              ) AS is_read
FROM alerts;

这可以通过外部联接完成:

SELECT a.id,
       a.title,
       a.description,
       ra.id IS NOT NULL AS is_read
FROM alerts AS a
LEFT JOIN read_alerts AS ra on a.id = ra.alert_id;
或使用相关子查询:

SELECT id,
       title,
       description,
       EXISTS (SELECT 1
               FROM read_alerts
               WHERE alert_id = alerts.id
              ) AS is_read
FROM alerts;

您所说的“最佳”是什么意思?这是一种只需使用一个查询即可实现的解决方案。我不需要考虑执行时间或类似的事情,你所说的“最佳”是什么意思?一个只有一个查询就能实现的解决方案。我不需要考虑执行时间或类似的事情。