我的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执行查询而不执行请求结果,否则它不起作用。
我的查询有什么问题,为什么它只能运作一次?
答案 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。