INSERT with SELECT工作一次

时间:2012-10-24 22:14:52

标签: sql sqlite

我的SQLite数据库上有3个表,如下所示:

表first_names

id
name
gender

表last_names

id
name

TABLE名称

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并且它第一次工作并不认为它会是无论如何也不需要它。

我认为这是因为有了独特的字段,但我确实有一个WHERE来确保名称不在表名中。

我已尝试使用C#和SQLiteAdmin执行查询而不执行请求结果,否则它不起作用。

我的查询有什么问题,为什么它只能运作一次?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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)

答案 2 :(得分:0)

您的查询只能运行一次,因为即使您为last_names添加了另一个名称,first_names.name中也没有值,而name.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。