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

时间:2018-04-18 20:32:22

标签: mysql sql

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

我有这些表格:

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

没有明显的我得到每一行的重复和不同的我得到一行标记0为每一行标记为1

我试过了:

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行

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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;

案例陈述实际上可以包括以下部分:

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

然而,真正需要的不是空的。真正的问题来自FROM部分中有两个表。这无意中创建了一个交叉连接,它必须为两个表运行上面的select语句。从而显示每一行的重复。因此需要特定定义的连接。内部联接仅显示两者中存在的数据。

但是,左外连接将显示左表中的所有数据以及右表中存在的数据。

希望这能帮助其他人处于同样的境地。

答案 1 :(得分:0)

通常可以通过完全外连接解决,但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;