select t.* from table1 t where t.id NOT IN(
select Id from t2 where usrId in
(select usrId from t3 where sId=value));
我需要的结果是,如果在t1和t2中有匹配的id,那么应该省略那些id,并且只剩下剩余的行给我。我尝试转换为加入,但它给了我想要的结果。以下是我的加入查询。
SELECT t.* FROM table1 t JOIN table2 t2 ON t.Id <> t2.Id
JOIN table3 t3 ON t3.Id=t2.Id WHERE t3.sId= :value
这并没有给我正确的结果。它返回所有行,但我想根据表t1和表t2中匹配的id来限制结果。应该从结果中省略匹配的id。我将传递sId的值。
答案 0 :(得分:1)
我相信这是使用连接的查询的准确重构。我不知道我们是否可以取消子查询,但无论如何逻辑看起来都是一样的。
select t1.*
from table1 t1
left join
(
select t2.Id
from table2 t2
inner join table3 t3
on t2.usrId = t3.usrId
where t3.sId = <value>
) t2
on t1.Id = t2.Id
where t2.Id is null
答案 1 :(得分:-1)
让我们分解并逐步解决问题。 所以你的查询
select t.* from table1 t where t.id NOT IN(
select Id from t2 where usrId in
(select usrId from t3 where sId=value));
将内部查询转换为JOIN将产生
select t.* from table1 t where t.id NOT IN
(SELECT T2.ID FROM T2 JOIN T3 on T2.UsrID =T3.UsrID and T3.sID=value)
在进一步转换为与外表的JOIN时将是
select t.* from table1 t LEFT JOIN
(SELECT T2.ID FROM T2 JOIN T3 on T2.UsrID =T3.UsrID and T3.sID=value)t4
ON t.id =T4.ID
WHERE t4.ID is NULL
如果您完全想删除子查询,可以尝试这样
SELECT t.*
FROM table1 t
LEFT JOIN T2
ON T.ID=T2.ID
LEFT JOIN T3
ON T3.UsrId=T2.UsrID AND T3.sId=value
WHERE T3.UsrID IS NULL