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
对于Table1
ID中与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 中的并不完全匹配。
id
table1中的。这些将是我们要删除的行。NOT IN
where语句中的子句将查询限制为仅查询foreign_key_id_column
表id
2s 列表中未包含的行。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"