2017-05-26 83 views
3
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

您使用的是MySQL还是MS SQL Server?不要标记不涉及的产品。 – jarlh

+0

*为什么要重写? – dnoeth

+0

@dnoeth Duh ...让像我们这样的用户可以在我们的SO收件箱中获得闪亮的绿色小点...为什么其他 –

回答

-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)); 

在转换内部查询的加盟将产生

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) 

其进一步转换与外部表的加盟将是

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 
+0

感谢所有人的回复,并且这两个查询都工作得很好。你能再帮我一个忙,我怎么能用hibernate – user3292629

+0

@ user3292629编写相同的查询我建议这将是一个不同的问题,你应该把它作为一个不同的问题发布在[SQL]和[hibernate]标签 – DhruvJoshi

+0

希望同样的hibernate查询。 – user3292629

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