2013-03-06 74 views
0

我寫了這個簡單的命令來測試delete命令,但發現了一些差異吧:的Sybase刪除命令無法正常運行

delete table1 from table1,table2 
where table1.col1 = table2.col1 
and table1.col2= table2.col2 

table1中我有272768行,表2我有1380行。現在我需要從table1中刪除Table2中可用的這1380行。但令我驚訝的是,在運行上述腳本之後,它從table1中刪除了2234行。預計的去除應該只有1380行。有什麼我可以做的,以優化這個?

+0

它可能是在表1中重複的行是拋出你的預期與實際結果?如果您執行計數(*)而不是刪除,會發生什麼情況? – 2013-03-06 14:42:57

+0

表2中的count(*)給了我1380行 – user726720 2013-03-06 14:49:01

+0

你寫的是一個語法錯誤,不是嗎?你需要在WHERE子句中的兩個術語之間有一個AND,對嗎? – 2013-03-06 14:52:12

回答

1

試試這個方法:

delete from table1 
from table2 
where table1.col1 = table2.col1 
and table1.col2= table2.col2 

delete from table1 
where exists 
(
    select 1 
    from table2 
    where table1.col1 = table2.col1 
    and table1.col2= table2.col2 

) 
+0

感謝您的及時回覆。我剛纔嘗試了這個。結果是相同的2234行。我只是想要它刪除這些1380行。我重新確認了表2中的行數,它是1380 ...不知道什麼是錯的。 – user726720 2013-03-06 14:03:26

+0

@ user726720我增加了一個解決方案。 – Parado 2013-03-06 14:10:14

+0

是的,它仍然是一樣的東西。好吧,讓我給你更多的見解。 Table1是原始表,table2是我從txt文件導入的。我清除了一些數據,我計劃從table1中刪除1380行,並將一些新行復制到table1中。現在表2中沒有任何pk或索引。你認爲這是它不能正常工作的原因嗎? – user726720 2013-03-06 14:38:40

0

如果您運行查詢:

SELECT COUNT(*) 
    FROM table1 JOIN table2 
    ON table1.col1 = table2.col1 AND table1.col2 = table2.col2 

,你會發現,1380排在table2比賽2234排在table1 ,所以DELETE正在做它應該做的事情。

該查詢是首選的形式;你可以使用過時的符號而不用明確的連接:

SELECT COUNT(*) 
    FROM table1, table2 
WHERE table1.col1 = table2.col1 AND table1.col2 = table2.col2 

但是你應該在你寫的任何東西中使用顯式的JOIN表示法;您只需要知道FROM子句中的逗號分隔列表,以瞭解在另一個千年中編寫的舊查詢。

+0

我無法使用第一個查詢。它給我加入錯誤(我正在使用Sybase v。11)。對於第二個查詢,它返回我2234,但這不是我所期望的。我希望它只刪除1380(表2中可用) – user726720 2013-03-06 15:21:46

+0

我不知道Sybase 11(這相當古老,不是嗎?)不支持顯式JOIN;我活着,我學習(可能會忘記)。 SELECT結果意味着'table1'中至少有一些條目用於'table2'中的某些條目。您可以運行查詢,例如'SELECT table1.col1,table1.col2,COUNT(*)FROM table1,table2 WHERE table1.col1 = table2.col1 AND table1.col2 = table2.col2 GROUP BY table1.col1,table1.col2 HAVING COUNT(*)> 1'來獲取具有重複項的(col1,col2)對列表。但問題出在數據上,而不是DELETE;它正在做它應該做的事情。 – 2013-03-06 15:53:15

+0

確定隊友,明天我會更新你,明天會做更多的測試,並檢查 – user726720 2013-03-06 16:03:24