2017-06-23 1 views
0

Quelqu'un peut-il m'aider s'il vous plaît avec cette tâche simple (mais je ne sais pas comment)?Réglez puis sélectionnez

Afin d'éviter de perdre du temps fixer chaque ligne, je suis en train de faire quelque chose comme ça

SET @auditor = a, b, c; 

    SELECT * 
    FROM Audits 
    WHERE auditor in (@auditor) 

Ma requête est en effet très long et cette partie « OU auditeur dans (@auditor) » sera être répétitif. Par conséquent, faire une sorte de Set première, il sera plus rapide de mettre à jour quand il y a des changements dans la force de travail (nous recrutons « d » et/ou « b » à gauche)

Merci à l'avance

+0

il est pas super clair ce que vous essayez de faites ici puisque vous avez seulement inclus un extrait. Pourquoi l'auditeur n'est-il pas une table? Ensuite, vous pouvez simplement ajouter ou supprimer des enregistrements et rejoindre ou sélectionner dans la table d'auditeurs pour déterminer s'ils existent. Ou mieux encore, ne supprimez pas les enregistrements mais un drapeau pour les marquer comme terminés ou non afin de ne pas perdre de données historiques. –

Répondre

0

Vous pouvez utiliser une variable de tableau et FIND_IN_SET

SET @auditors = 'a,b,c'; 

SELECT * 
FROM Audits 
WHERE FIND_IN_SET(auditor,@auditors) 

Explication: FIND_IN_SET(auditor,@auditors) est vrai est auditeur se trouve dans @auditors et dans ce cas, il renvoie l'index. Mais je considérerais d'enregistrer les auditeurs dans un tableau séparé plutôt que dans une variable pour mieux les suivre.

+0

C'est génial. Et merci pour votre recommandation d'avoir un tableau distinct pour l'auditeur. Crois-moi, j'adorerais ça mais c'est pour le moment impossible pour moi. –

1

Je recommande en utilisant une table temporaire en haut de votre requête à la place:

CREATE TEMPORARY TABLE FilteredAudits AS (SELECT * FROM Audits WHERE Auditor IN (a,b,c)) 

Puis Audits avec remplacer FilteredAudits au besoin. Les avantages de cette approche sont que vous garantissez que le filtre ne sera appliqué qu'une seule fois, ce qui signifie que le reste de la requête JOIN au plus petit jeu de données possible et que vous n'avez pas besoin de répéter votre filtre IN() pendant toute la requête .

0

Vous ne pouvez pas définir un paramètre comme un tableau. vous devrez faire quelque chose comme

set @ auditeur = « a, b, c »

maintenant si l'auditeur est un certain nombre cela devrait fonctionner, mais si elle est autre chose, vous devrez créer un dbo funciton . [tfn_SplitList] sur votre système, vous utiliserez comme ci-dessous

vérificateur (sélectionnez Liste de dbo. [tfn_SplitList] (@ auditeur, « »))