1

Zotero guiはまだ複数のレコードの編集を一度にサポートしていないため、sqlite3を使用してZoteroデータベースをハッキングしています。現在のタスクは、特定のジャーナルからすべてのアイテムを検索し、まだ値がないアイテムを分離して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'));

のリストがitemIDできたので、テーブルに一連のエントリを追加し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」の場合です。アコースト。Soc。午前。' (私はそれらの値を取得する方法を知っています)。このステートメントを記述して、、、、などを上記のクエリのsにINSERT INTO置き換えるAにはどうすればよいですか?BCitemIDSELECT

注:一部のレコードには、すでにジャーナルの略語が含まれています。私はSQL数日しか書いていませんのでINSERT、テーブルにすでに存在するレコードを試行するときに問題が発生するかどうかはわかりません(主キーの漠然とした理解に基づいて、問題が発生すると想定しています。itemDataテーブルのスキーマセクションに行が含まれているという事実PRIMARY KEY (itemID, fieldID))。したがって、Xをとして含むitemIDレコードがすでにあるsを最初に除外する必要がある場合があります。itemDatafieldID

4

3 に答える 3

1

@drammockとの話し合いはほとんどなく、機能しているクエリが見つかりました。このクエリの主要部分はEXCEPTキーワードです。

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、ステートメントに外部キーリンクをFROM含めることで句を簡略化しWHERE、私の意見では読みやすくするという私の好みの構文のみです。

また、自己結合を追加し、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

また、探しているのがジャーナルの略語だけである場合は、MEDLINEのリストを介して自動ジャーナルの略語があるZoteroの3.1ブランチのブランチxpiを実行することを検討してください: http ://www.zotero.org/support/dev_builds#zotero_31_branch

于 2013-03-04T21:19:20.603 に答える