Answers:
这是一个简单的查询:
SELECT t1.ID
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL
关键点是:
LEFT JOIN用来; 它将返回来自的所有行Table1,而不管其中是否有匹配的行Table2。
该WHERE t2.ID IS NULL条款;这会将返回的结果限制为仅返回ID Table2为null的那些行,换句话说,没有Table2针对该ID的特定记录Table1。Table2.ID对于Table1ID中与ID不匹配的所有记录,将以NULL的形式返回Table2。
NULL您的架构中的ID有效,那么您可能会遇到更大的问题,您是否同意?:)
SELECT t1.ID, t2.ID并删除WHERE行,您将更好地了解其工作原理。
我将使用EXISTS表达式,因为它更强大,例如,如果LEFT JOIN您必须处理联接表中的所有内容,则可以更精确地选择要联接的行。它的效率可能与LEFT JOIN使用null测试的情况相同。
SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
EXISTS是可变性。
WHERE t2.id IS NULL)谢谢。
SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)
表1有一列要添加外键约束,但foreign_key_id_column与id表2 中的并不完全匹配。
idtable1中的。这些将是我们要删除的行。NOT INwhere语句中的子句将查询限制为仅查询foreign_key_id_column表id2s 列表中未包含的行。SELECT括号中的语句将获得id表2 中所有的列表。IN带字面值列表的子句限制有关。它不适用于IN对子查询的结果使用子句。该问题的公认答案实际上是通过使用子查询解决了该问题。(大量的文字值列表是有问题的,因为它创建了一个巨大的SQL表达式。子查询可以正常工作,因为即使结果列表很大,SQL表达式本身也很小。)
现在我要从雇员表中那些不在薪水中的记录。 我们可以通过3种方式做到这一点:
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)
从这里类似的问题,MySQL内部联接查询以获取其他表中不存在的记录,我得到了这个
SELECT * FROM bigtable
LEFT JOIN smalltable ON bigtable.id = smalltable.id
WHERE smalltable.id IS NULL
smalltable是您缺少记录的地方,bigtable是所有记录的地方。该查询列出了上不存在smalltable但存在的所有记录bigtable。您可以用id任何其他匹配条件替换。
您可以选择如下所示的视图:
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 IFNULL(`price`.`fPrice`,100) as fPrice,product.ProductId,ProductName
FROM `products` left join `price` ON
price.ProductId=product.ProductId AND (GeoFancingId=1 OR GeoFancingId
IS NULL) WHERE Status="Active" AND Delete="No"