0

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

表名

id
name
gender

表姓氏

id
name

表名

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

其中 first 和 last 是唯一的,并且还有一个索引,在 names 表上都是唯一的。

为了提供名称表,我使用了以下查询,该查询第一次有效,但是在我向 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])with values asnull AS [birthday], 0 AS [used]但由于它的生日在表格设计中设置为 null 并且默认为 0 并且它在第一次工作时认为不需要它也没有任何区别。

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

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

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

4

3 回答 3

2

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

于 2012-10-24T22:20:48.403 回答
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)
于 2012-10-24T22:20:49.827 回答
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 来连接这些子句。

于 2012-10-24T22:26:33.370 回答