2012-10-24 79 views
0

我有我的SQLite數據庫3個表如下:INSERT與SELECT工作一次

表first_names

id 
name 
gender 

表last_names

id 
name 

表名

id 
first 
last 
gender 
birthday (null) 
used (default 0) 

首先和最後是唯一的,並且在名稱表上也有一個唯一的索引。

爲了填充名稱表我已經使用了下面的查詢,這是第一次工作,但是在我給last_names添加了一個新名稱並嘗試再次使用它之後,它失敗了。

INSERT INTO names (first, last, gender) 
     SELECT f.name AS first, l.name AS last, f.gender AS gender 
       FROM first_names f 
       LEFT JOIN last_names l 
       WHERE f.name NOT IN (SELECT first FROM names) AND 
        l.name NOT IN (SELECT last FROM names) 

在使用(first, last, gender, [birthday], [used])與價值觀也嘗試作爲null AS [birthday], 0 AS [used]但因爲它的生日設置爲上表的設計null且用於0作爲默認值,它的工作就第一時間沒有想到這將需要也不做無論如何,任何差異。

我認爲這是因爲獨特的領域,但我確實有一個地方,以確保名稱不在表名中。

我已經嘗試使用C#和SQLiteAdmin執行查詢,無需請求結果執行,否則它不工作。

我的查詢有什麼問題,爲什麼它只能用一次?

+0

你是什麼意思查詢失敗?它沒有插入任何記錄嗎?它有錯誤嗎?錯誤是什麼? –

+0

@AdamWenger它不會拋出任何錯誤,它只是失敗的沉默......是的,它沒有添加任何新的記錄,它用於添加新名稱,使用我剛剛添加的新姓氏。事實上,在SQLiteAdmin中,它表示查詢已執行且數量爲ms。 – Prix

+1

我都是爲了「正常化」,但我認爲三個表名稱是有點過分:)恕我直言...... – paulsm4

回答

2

嘗試使用: WHERE NOT EXISTS (SELECT * FROM names n WHERE n.first=f.name AND n.last=l.name)

+0

非常感謝。 – Prix

1

你不檢查的姓和名都在同一記錄 我沒有通過SQL命令行運行它,但它應該工作:

INSERT INTO names (first, last, gender) 
     SELECT f.name AS first, l.name AS last, f.gender AS gender 
       FROM first_names f 
       LEFT JOIN last_names l 
       WHERE f.name NOT IN (SELECT subquery.first FROM (SELECT * FROM names WHERE l.name = last AND f.gender=gender) subquery) 
0

你的查詢只因爲即使你已經添加了另一個名字last_names,存在first_names.name沒有價值是不存在的names.first工作一次:

WHERE 
    f.name NOT IN (SELECT first FROM names) AND 
    l.name NOT IN (SELECT last FROM names) 

所有f.name的更多鈔票值包括在SELECT first FROM names

也許你想加入這些條款與OR,而不是AND。