我的任务是创建一个视图,该视图将添加一个列,用于检查一个表的两行中的数据是否与另一个表的相同两行匹配。
我有这些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行
有什么想法吗?
2条答案
按热度按时间niknxzdl1#
感谢我的一位同事的帮助,这就是解决方案:
case语句实际上可以包括以下部分:
然而,真正需要的只是一个notnull。真正的问题来自于from部分中有两个表。这在无意中创建了一个交叉连接,它必须为两个表运行上面的select语句。从而显示每一行的副本。因此需要一个专门定义的连接。内部联接只会显示两者中存在的数据。
但是,左外联接将显示左表中的所有数据以及右表中存在的数据。
希望这能帮助其他处于同样处境的人。
u5i3ibmn2#
这通常可以通过一个完整的外部连接来解决,但是mysql不支持这一点。
但是,这些任务表明这些表不包含重复项。它还建议我们可以在比较中包含名称。因此,您只需查看表的并集即可检测重复项: