Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用'select'的结果作为'insert-in'的参数`_Sql_Select_Sqlite_Bulkinsert - Fatal编程技术网

Sql 如何使用'select'的结果作为'insert-in'的参数`

Sql 如何使用'select'的结果作为'insert-in'的参数`,sql,select,sqlite,bulkinsert,Sql,Select,Sqlite,Bulkinsert,我正在用sqlite3攻击我的Zotero数据库,因为Zotero gui仍然不支持一次编辑多个记录。当前任务是查找特定日记中的所有项目,将那些尚未具有journalableviation值的项目分离出来,并添加正确的缩写。以下是相关表格: fields (fieldID, fieldName, fieldFormatID) itemData (itemID, fieldID, valueID) itemDataValues (valueID, value) 以下是我的查询,以查找我想要的所有

我正在用sqlite3攻击我的Zotero数据库,因为Zotero gui仍然不支持一次编辑多个记录。当前任务是查找特定日记中的所有项目,将那些尚未具有
journalableviation
值的项目分离出来,并添加正确的缩写。以下是相关表格:

fields (fieldID, fieldName, fieldFormatID)
itemData (itemID, fieldID, valueID)
itemDataValues (valueID, value)
以下是我的查询,以查找我想要的所有记录:

SELECT itemData.itemID
FROM fields JOIN itemData JOIN itemDataValues 
WHERE (fields.fieldname IN ('publicationTitle'))  
AND (fields.fieldID = itemData.fieldID) 
AND (itemData.valueID = itemDataValues.valueID) 
AND (itemDataValues.value IN ('The Journal of the Acoustical Society of America'));
现在我有了
itemID
s的列表,我想向
itemData
表添加一组条目。示意图上我想这样做:

INSERT INTO itemData (itemID, fieldID, valueID)
VALUES (A,X,Y),(B,X,Y),(C,X,Y), ... (W,X,Y);
其中,X是“JournalAbraviation”的
字段ID
,Y是“J.Acoustic”的
值ID
。Soc。(我知道如何获得这些值)。如何将此
插入到
语句中,用上面我的
选择
查询中的
itemID
替换
A
B
C


注意:一些记录中已经有日记缩写。我只写了几天
SQL
,所以我不知道尝试
插入表中已经存在的记录是否会导致问题(我假设会,基于对主键的模糊理解以及
itemData
表中的schema部分包含一行
主键这一事实)(itemID,fieldID)
)。因此可能有必要首先排除那些在
itemData
中已经有记录的
itemID
,其中包括X作为
fieldID

,与@drammock讨论很少,发现一个查询正在工作。此查询的主要部分是
除了
关键字

INSERT INTO itemData (itemID, fieldID, valueID) 
SELECT itemData.itemID, 25, 8356
FROM fields JOIN itemData JOIN itemDataValues 
WHERE (fields.fieldname IN ('publicationTitle'))  
AND (fields.fieldID = itemData.fieldID) 
AND (itemData.valueID = itemDataValues.valueID) 
AND (itemDataValues.value IN ('The Journal of the Acoustical Society of America'))
EXCEPT SELECT itemData.itemID, 25, 8356
FROM fields JOIN itemData JOIN itemDataValues 
WHERE (fields.fieldname IN ('journalAbbreviation'))  
AND (fields.fieldID = itemData.fieldID) 
AND (itemData.valueID = itemDataValues.valueID) 
AND (itemDataValues.value IN ('J. Acoust. Soc. Am.', 'J Acoust Soc Am'));

这基本上是Ravindra答案的副本,只有
DISTINCT
和我喜欢的语法,即在
FROM
语句中有外键链接,简化了
WHERE
子句,我认为这会使它更具可读性

我还添加了一个自连接,并说
WHERE existing.itemID为NULL
,以避免插入已经存在的记录

INSERT INTO itemData (
  itemID, 
  fieldID, 
  valueID) 
SELECT DISTINCT
  itemData.itemID, 
  'journalAbbreviation', 
  'Journal of the Acoustical Society of America' 
FROM 
  fields 
    INNER JOIN itemData ON fields.fieldID = itemData.fieldID
    INNER JOIN itemDataValues ON itemData.valueID = itemDataValues.valueID
    LEFT OUTER JOIN itemData existing ON itemData.itemID = existing.itemID
WHERE 
  fields.fieldname = 'publicationTitle'
  AND itemDataValues.value = 'The Journal of the Acoustical Society of America'
  AND existing.itemID IS NULL

您可能希望通过Zotero的javascript API实现这一点,这使得数据损坏的可能性大大降低。

此外,如果您所要查找的是日志缩写,请考虑为ZoTeO的3.1分支运行分支XPI,它通过MEDLINE的列表具有自动日记缩写:


…你试过用谷歌搜索你的问题吗?只要你知道它在那里,这是非常基本的语法。@Syn123:我假设它在那里,我用谷歌搜索。作为一个SQL新手,我显然没有找到正确的搜索词,或者当我看到它时没有识别正确的答案。我发现的一切似乎都暗示着你必须编写将
INSERT-INTO…VALUES(),(),();
语句的每条记录分别删除,这似乎效率极低。因此我请求帮助。如果有帮助,我在谷歌上搜索到的上面的链接是:“SQL INSERT-INTO-SELECT”.I谷歌大多数与SQL相关的东西都是以类似的方式进行的,因为SQL是一种非常流行的技术。使用
DISTINCT
关键字或内部连接来获取不同的值集。检查更新的查询。让我们解释一下:25是“JournalAbreliation”的
字段ID
,8356是“JournalAbreliation”的
值ID
我考虑过使用API,但我对Javascript不太了解。很高兴知道缩写正朝着自动添加的方向发展。