1

我正在用 sqlite3 破解我的 Zotero 数据库,因为 Zotero gui 仍然不支持一次编辑多个记录。当前任务是从特定期刊中查找所有项目,分离出那些还没有值的项目journalAbbreviation,并添加正确的缩写。以下是相关表格:

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'));

现在我有了itemIDs 列表,我想向表中添加一堆条目itemData。示意图我想这样做:

INSERT INTO itemData (itemID, fieldID, valueID)
VALUES (A,X,Y),(B,X,Y),(C,X,Y), ... (W,X,Y);

其中 X 是fieldID“journalAbbreviation”,Y 是valueID“J”。声学。社会党。是。' (我知道如何获得这些值)。如何编写此INSERT INTO语句以用上面查询中的s替换ABC等?itemIDSELECT

注意:一些记录中已经有期刊缩写。我才写SQL了几天,所以我不知道尝试INSERT表中已经存在的记录是否会导致问题(我假设它会,基于对主键的模糊理解和itemData表中的架构部分包含一行的事实PRIMARY KEY (itemID, fieldID))。因此,可能有必要首先排除那些itemID已经有记录的 s,itemData其中包含 X as fieldID

4

3 回答 3

1

With little discussion with @drammock, found a query that is working. Main part of this query is EXCEPT keyword.

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'));
于 2013-03-04T18:39:00.407 回答
1

这基本上是 Ravindra 的答案的副本,仅使用了我的首选语法,即在简化子句DISTINCT的语句中使用外键链接,并在我看来使其更具可读性。FROMWHERE

我还添加了一个自连接,并表示WHERE existing.itemID IS 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
于 2013-03-04T19:24:52.733 回答
1

您可能希望通过 Zotero 的 javascript API 来执行此操作,这使得数据损坏的可能性大大降低。 http://www.zotero.org/support/dev/client_coding/javascript_api

此外,如果您要查找的只是期刊缩写,请考虑为 Zotero 的 3.1 分支运行 xpi 分支,该分支通过 MEDLINE 的列表具有自动期刊缩写: http ://www.zotero.org/support/dev_builds#zotero_31_branch

于 2013-03-04T21:19:20.603 回答