2017-05-26 73 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