我正在对一个数据库应用程序进行一些维护工作,我发现,最令人高兴的是,即使一个表的值以外键的样式使用,但表上没有外键约束。
我试图在这些列上添加FK约束,但我发现,因为在以前的错误中已经有大量坏数据,这些错误已经被天真地纠正了,所以我需要找到与另一个表不匹配的行,然后删除它们。
我在网上找到了一些这类查询的例子,但它们似乎都提供了例子而不是解释,我不明白为什么它们能起作用。
有人能向我解释一下如何构造一个查询,返回另一个表中没有匹配的所有行,以及它在做什么,这样我就可以自己进行这些查询,而不是对这个混乱中没有FK约束的每个表运行so ?
你可以选择视图,如下所示:
CREATE VIEW AuthorizedUserProjectView AS select t1.username as username, t1.email as useremail, p.id as projectid,
(select m.role from userproject m where m.projectid = p.id and m.userid = t1.id) as role
FROM authorizeduser as t1, project as p
然后对视图进行选择或更新:
select * from AuthorizedUserProjectView where projectid = 49
产生如下图所示的结果,即对于不匹配的列,已填充null。
[Result of select on the view][1]
我们有以下两张表(工资和员工)
现在我想要员工表中不包含工资的那些记录。
我们可以通过三种方式做到这一点:
使用内部连接
select * from employee
where id not in(select e.id from employee e inner join salary s on e.id=s.id)
使用左外连接
select * from employee e
left outer join salary s on e.id=s.id where s.id is null
使用完全连接
select * from employee e
full outer join salary s on e.id=s.id where e.id not in(select id from salary)