2015-09-01 30 views
1

您好我有這個實時的問題,我的項目,說我有兩個表組合兩個表的優化Sql查詢?

TABLE STUDENT &表CLASSATTENDANCEHISTORY,(名字是虛構的)

STUDENT 
NAME, ID, LAST_TIME_SEEN_IN_COLEGE, 


CLASSHISTORY 
CLASSNAME, ID, STUDENT_ID, LAST_TIME_PRESENT, 

「現在我要刪除所有列表學生誰是學生.last_time_seen_in_colege> classHistory.last_time_present「

作爲兩個表,可以說會有數百萬行,所以我認爲這樣做批次一次,50個批次,或表將鎖定爲很長一段時間,這兩張表都非常有用表格。

大量的操作將在那裏爲兩個表,所以我想批量使用。

無論是JOIN還是SUBQUERY都是最好的?或者我可以在JAVA存儲器中存儲整個表而不是過程?請一些專家的建議,我希望它是最好的?

我知道我們可以使用內部連接,但我想知道有效的方法來做到這一點,如果我說內部連接每次50內部連接將每次搜索整個表。

+0

你爲什麼要關閉?請回復(也只是嘗試一下,我猜聯接工作正常,Java可能會耗盡內存,但請親自看看) – zapl

+0

這是針對MySQL還是SQL Server?請刪除它不適用的標籤。 – Anders

+0

即使有數百萬條記錄,如果您有合適的索引,聯接應該非常高效。你應該可以在一個簡單的sql語句中執行刪除操作(如果你絕對需要,你可以添加一個限制子句並重復執行查詢,直到它返回0記錄修改爲止)。 – John

回答

1
delete from student where id in (select id from student s where exists (select null from classhistory c where s.last_time_seen_in_college > c.last_time_present) 

上面的查詢將在這種情況下工作。

解釋上問湯姆時使用加入以及何時去子查詢 https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66812779016023

Java是不是你所說的那個表將擁有數百萬行的選擇那些數百萬行和這種情況下的選擇將它們存儲到結果集中,然後處理它們將花費我們可以想象的更多時間。

+0

正如我已經提到的,表名和結構是虛構的!我給了名字有一個清楚的理解。 – Bikash

+0

鏈接是有用的,但最後一個問題沒有答案?存在哪些作用可以使其更快? – Bikash

+1

如果你只是想檢查其他表中是否存在1個實體存在是最好的解決方案。例如假設有2個表student,library_entries,在student中有3個分別爲student_id 1,2,3的條目。有30個條目,其中20個爲student_id 1,10個爲student id 2,您只需要檢查特定的id是否存在於其他表中,在這種情況下存在是有益的。如果您想從表中檢索所有匹配的行連接更有利。希望能幫助到你 –