转换为加入查询

时间:2017-05-26 07:58:15

标签: sql join

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的值。

2 个答案:

答案 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