我有一個嵌入Flash遊戲的Drupal網站。PostgreSQL加入:刪除一個表中的記錄,但不是另一個
註冊網站用戶都在drupal_users上市表 - 在這裏的人的名單,註冊了一個多星期前:
# select uid, created from drupal_users where
to_timestamp(created) < (now() - interval '7 days') limit 5;
uid | created
------+------------
9903 | 1300257067
9904 | 1300259929
9750 | 1299858284
9751 | 1299858603
8083 | 1285514989
(5 rows)
閃存遊戲用戶另一個表列 - 在pref_users,並有 「DE」 的字符串前置到其ID:
# select id from pref_users where id like 'DE%' limit 5;
id
--------
DE9054
DE9055
DE9056
DE9057
DE9058
(5 rows)
我想擺脫一個星期前在我的網站註冊的(可能是垃圾郵件機器人)用戶,但仍然沒有玩過Flash遊戲。即我想刪除drupal_users記錄,這些記錄不存在於pref_users表中。
同時我不想做這樣的事情:
# delete from drupal_users where
to_timestamp(created) < (now() - interval '7 days') and
'DE'||uid not in (select id from pref_users where id like 'DE%');
,因爲我不知道,select語句上面有多大允許是(也許是有極限的我使用PostgreSQL 8.4.7和CentOS 5.5/64位在Drupal7之前,我使用phpBB3,有時候我看到這種SQL語句在刪除phpBB3管理控制檯中的舊論壇帖子時失敗了。
所以我的問題是,如果上面的聲明可以重寫爲some kind of SQL-join?
因爲我打了一些PostgreSQL的限制(不記得是哪一個,抱歉)具有類似的語句從「刪除:
與清理table1其中id在(從table2中選擇id)「從phpBB3 ACP刪除舊的論壇帖子時。 – 2011-04-06 09:57:53
PostgreSQL有一個DELETE的擴展(非標準),你可以用USING指定另一個表,但我猜這在這裏是不可能的(因爲 - 如果我理解USING正確 - 它總是執行一個內部連接)。但你可能想自己檢查一下。 – 2011-04-06 10:36:58
好吧,你是否認爲添加不同的(從pref_users選擇ID,像'DE%'這樣的ID)是一個好主意? – 2011-04-06 11:02:04