2014-03-18 59 views
0

我有一個非常基本的SQL知識,但爲了處理大量數據,我需要使用它。這裏是我的問題:根據字段刪除記錄時,與另一個表進行比較

我有兩個表,如下:

table1: 
id begin end 
100 1998  2013 
101 1996  2009 

table2: 
id date  price qtt 
100 1996  10  200 
100 1999  12  200 
101 1997  13  100 
101 2013  14  100 

我需要做的是消除了具有不同於begindate小於或大於enddate更大每個ID行。這意味着對於id 101,沒有記錄應該有日期在1996年之前也沒有2009年後

所以我預期的結果是:

id date  price qtt 
100 1999  12  200 
101 1997  13  100 

效率是一個問題,因爲我做這行的表幾百萬記錄。我已經準備好這些表的sqlfiddle,以便它更容易。

http://sqlfiddle.com/#!2/66f54f/1

我道歉,如果這個問題太簡單了,但搜索了三個小時後,我無法來解決它自己。先謝謝你!

+1

? –

+0

坦率地說,我並不知道。我通過SSH訪問學術數據庫,然後遠程執行SAS腳本,通過它我使用SQL。所以,我通過SQL訪問SAS文件。我不知道如何回答你的問題,我不知道在這個問題上它是​​否仍然適用。 – sasstudent

+0

「數據庫」將是「proc-sql」或「sas」。 –

回答

2

下面是標準的SQL語法,你想做什麼:

delete from table2 
    where not exists (select 1 
         from table1 
         where table1.id = table2.id and 
          table2.date between table1."begin" and table1."end" 
        ); 

請注意,如果id存在於table2但不table1,則該id所有行都將被刪除。

如果您在table1(id, date)上有索引,這在大多數數據庫中應該是非常高效的。

+0

謝謝你的快速回答。你能用SQLFiddle做這個工作嗎?我想測試它,因爲我的「工作環境」不是最友好的(SAS中的SQL,遠程執行的SAS,打印表格,檢查結果)。 – sasstudent

+0

我將您的解決方案應用於我的數據庫,它工作正常!非常感謝你。我現在需要添加一個'價格'×'數量'列(這很容易),然後將該列除以具有相同'日期'的記錄的該列的總和。這並不容易。我正在調查,但它仍然沒有定論...... – sasstudent

+0

爲什麼不使用'between'?代碼少就好。 – Bohemian

0

嘗試......

DELETE FROM A 
FROM TABLE2 A 
inner join table1 B 
on A.id=B.id 
and (A.[DATE] BETWEEN B.[BEGIN] AND B.[End]) 
您正在使用什麼數據庫
+0

你好。對不起,我還沒有嘗試過你的解決方案,但感謝你的幫助。 – sasstudent

相關問題