Je ne suis pas un expert SQL, voici ma requête SQLite sur la table "Requête" (clé: SystemId, TopicId, DocumentId, toutes aussi des clés étrangères) qui obtient les clés étrangères et les insert en évitant les doublons. Mais il est énorme, laide et je dois exécuter des milliers de fois:Comment optimiser cette requête énorme et laide, en ignorant les doublons?
command.CommandText = "INSERT INTO Query (SystemId, TopicId, DocumentId) " +
"(SELECT Id FROM System WHERE Tag = @SystemTag COLLATE NOCASE), " +
"(SELECT Id FROM Topic WHERE Number = @TopicNumber COLLATE NOCASE), " +
"(SELECT Id FROM Document WHERE Number = @DocNumber COLLATE NOCASE) " +
"WHERE NOT EXISTS (SELECT 1 FROM Query WHERE " +
"SystemId = (SELECT Id FROM System WHERE Tag = @SystemTag) AND " +
"TopicId = (SELECT 1 FROM Topic WHERE Number = @TopicNumber) AND " +
"DocumentId = (SELECT Id FROM Document WHERE Number = @DocNumber))";
Question: Toute façon de dire sql « ne vous inquiétez pas de doublons, ignorer l'instruction d'insertion ». Ou peut-être en utilisant des variables/tables temporaires, des déclarations AD?
EDIT: requête droite:
INSERT INTO Query (SystemId, TopicId, DocumentId)
(SELECT Id FROM System WHERE Tag = @SystemTag COLLATE NOCASE),
(SELECT Id FROM Topic WHERE Number = @TopicNumber COLLATE NOCASE),
(SELECT Id FROM Document WHERE Number = @DocNumber COLLATE NOCASE)
WHERE NOT EXISTS (SELECT 1 FROM Query WHERE
SystemId = (SELECT Id FROM System WHERE Tag = @SystemTag) AND
TopicId = (SELECT 1 FROM Topic WHERE Number = @TopicNumber) AND
DocumentId = (SELECT Id FROM Document WHERE Number = @DocNumber));
Cela dans un INSERT en utilisant SELECT, je dois éviter les doublons ... – gremo