Sql希望从表中获取匹配记录和新记录

Sql希望从表中获取匹配记录和新记录,sql,Sql,我不熟悉SQL查询,我有表: 表1: Id | Flag ----+------ 200 | 1 201 | 1 202 | 1 203 | 1 204 | 1 Id | Flag ----+------ 200 | 0 203 | 1 表2: Id | Flag ----+------ 200 | 1 201 | 1 202 | 1 203 | 1 204 | 1 Id | Flag ----+------ 200 | 0 203 | 1 我想要这样的结果: Id | Fla

我不熟悉SQL查询,我有表:

表1

Id  | Flag
----+------
200 | 1
201 | 1
202 | 1
203 | 1
204 | 1
Id  | Flag
----+------
200 | 0
203 | 1
表2

Id  | Flag
----+------
200 | 1
201 | 1
202 | 1
203 | 1
204 | 1
Id  | Flag
----+------
200 | 0
203 | 1
我想要这样的结果:

Id  | Flag
----+------
200 | 0
201 | 1
202 | 1
204 | 1

我已尝试使用left join,但仍然没有得到预期的结果。

您似乎想要所有行,但在
标志
列中都带有“1”的行除外。然后,如果可用,您需要表2中的标志

如果这是正确的解释:

select t1.id, coalesce(t2.flag, t1.flag)
from table1 t1 left join
     table2 t2
     on t1.id = t2.id
where t1.flag <> 1 or
      (t2.flag is null or t2.flag <> 1)
选择t1.id,合并(t2.flag,t1.flag)
从表1到t1左连接
表2 t2
在t1.id=t2.id上
其中t1.1或
(t2.flag为空或t2.flag 1)

是一个dbfiddle。

您似乎想要所有行,除了在两个
标志
列中都带有“1”的行。然后,如果可用,您需要表2中的标志

如果这是正确的解释:

select t1.id, coalesce(t2.flag, t1.flag)
from table1 t1 left join
     table2 t2
     on t1.id = t2.id
where t1.flag <> 1 or
      (t2.flag is null or t2.flag <> 1)
选择t1.id,合并(t2.flag,t1.flag)
从表1到t1左连接
表2 t2
在t1.id=t2.id上
其中t1.1或
(t2.flag为空或t2.flag 1)

是一个dbfiddle。

您似乎想要一个联接,其中
表b
中的
标志
值优先于
表a
中的值,并且
标志
值在两个表中不匹配

如果是这种情况,您可以通过使用以及
WHERE
条件来删除连接失败的项目和匹配的
标志
值来实现这一点:

选择a.ID,
合并(b.Flag,a.Flag)标志
从表a
左连接表b
在a.ID=b.ID上
和(b.Flag为空或a.Flag b.Flag)
例子 您可以在给定数据输出预期值的情况下:


您似乎想要一个联接,其中
表b
中的
标志值优先于
表a
中的值,并且
标志值在两个表中不匹配

如果是这种情况,您可以通过使用以及
WHERE
条件来删除连接失败的项目和匹配的
标志
值来实现这一点:

选择a.ID,
合并(b.Flag,a.Flag)标志
从表a
左连接表b
在a.ID=b.ID上
和(b.Flag为空或a.Flag b.Flag)
例子 您可以在给定数据输出预期值的情况下:


请解释逻辑,特别是过滤掉“3”。我有主表和审核表,我想从主表中获取值已更改的记录,以及从主表中新添加的任何记录。请解释逻辑,特别是过滤掉“3”。我有主表和审核表,我想从主表中获取值已更改的记录以及从主表中添加的任何记录谢谢。但在这种情况下也得到了203分。我不应该得到203,因为它在两个表中都有相同的值。您只需要指定连接失败的时间(例如b标志为NULL)和标志不匹配的时间(例如a标志b标志)。我已经相应地更新了答案和示例。适合我。谢谢,谢谢。但在这种情况下也得到了203分。我不应该得到203,因为它在两个表中都有相同的值。您只需要指定连接失败的时间(例如b标志为NULL)和标志不匹配的时间(例如a标志b标志)。我已经相应地更新了答案和示例。适合我。感谢您仅获取带有标志=0@revolutionNET . . . 我添加了一个dbfiddle来演示逻辑是否有效。仅获取带有标志=0@revolutionNET . . . 我添加了一个dbfiddle来证明逻辑是有效的。