检查两个表中两行中存在的数据

ma8fv8wu  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(244)

我的任务是创建一个视图,该视图将添加一个列,用于检查一个表的两行中的数据是否与另一个表的相同两行匹配。
我有这些table:

Table 1
Name               ID                            Team
John               35                           1
Josh               89                           1
Josh               89                           2
Josh               89                           3
Jim                25                           2

Table2
Name             ID                            Team
Josh             89                           1
John             35                           1

我需要创建一个视图来添加一个列,每当table1.id和table1.team匹配table2.id和table2.team时,该列就会放置一个数字1。这样地:

NEW view
NAME            ID                            TEAM                    CHECK
John            35                           1                              1
Josh            89                           1                              1
Josh            89                           2                              0
Josh            89                           3                              0
Jim             25                           2                              0

但是,我能得到的最接近的代码是:

Select distinct 
     table1.name, table1.id, table1.team,
                CASE
                     WHEN
                          (table1.id = table2.id)
                     AND 
                          (table1.team = table2.team)
                     THEN 1
                     ELSE 0
                END AS check
FROM 
     table1, table2 order by check desc;

返回:

NEW view
NAME         ID                            TEAM                    CHECK
John         35                           1                              1
Josh         89                           1                              1
John ----    35 -----                     1  -----                       0
Josh ----    89 -----                     1  -----                       0
Josh         89                           2                              0
Josh         89                           3                              0
Jim          25                           2                              0

如果没有distinct,我会得到每一行的副本,如果使用distinct,我会得到每一行标为1的0行
我试过:

Select a.id, a.team, 
    CASE
        WHEN
            ( select  a.id from v_admins a
              Where  
                    a.id = (select  o.id from oncallorder o)
              And  
                    a.team = ( select o.team from oncallorder o) 
            )
        THEN 1
        ELSE 0
    END AS adminisoncall
    FROM v_admins a, oncallorder o 
    order by adminisoncall desc;

但它只是出错了:错误代码:1242。子查询返回多于1行
有什么想法吗?

niknxzdl

niknxzdl1#

感谢我的一位同事的帮助,这就是解决方案:

Select table1.name, table1.id, table1.team,
                CASE
                    WHEN
                        table2.team is not null
                    THEN 1
                    ELSE 0
                END as check
FROM table1 left outer join table2 
    on table1.id = table2.id and table1.team = table2.team  
    order by check desc;

case语句实际上可以包括以下部分:

(table1.id = table2.id) AND (table1.team = table2.team)

然而,真正需要的只是一个notnull。真正的问题来自于from部分中有两个表。这在无意中创建了一个交叉连接,它必须为两个表运行上面的select语句。从而显示每一行的副本。因此需要一个专门定义的连接。内部联接只会显示两者中存在的数据。
但是,左外联接将显示左表中的所有数据以及右表中存在的数据。
希望这能帮助其他处于同样处境的人。

u5i3ibmn

u5i3ibmn2#

这通常可以通过一个完整的外部连接来解决,但是mysql不支持这一点。
但是,这些任务表明这些表不包含重复项。它还建议我们可以在比较中包含名称。因此,您只需查看表的并集即可检测重复项:

select name, id, team, case when count(*) > 1 then 1 else 0 end as check
from
(
  select name, id, team from table1
  union all
  select name, id, team from table2
) data
group by name, id, team;

相关问题