8
votes

Query: Trouvez des lignes qui n'appartiennent pas à une liste de valeurs

Permet de considérer que j'ai une table 'onglet' qui a une colonne 'col'

the table 'onglet' a cette donnée - xxx

si j'ai un ensemble de valeurs (2,3,6,7). Je peux interroger les valeurs présentes dans la table et la liste en poursuivant la requête xxx

mais, si je veux renvoyer les valeurs de la liste qui ne sont pas présentes dans la table à savoir seulement (6,7) dans ce cas. Quelle requête dois-je utiliser?


3 commentaires

Sur quelle version et quelle version êtes-vous?


Dans les commentaires, vous avez annexé à diverses réponses, je vois que vous traitez avec des valeurs de chaîne, non des entiers et que votre liste d'entrée contient quelque part dans le voisinage de 70 valeurs. Cherchez-vous à écrire une procédure stockée? En utilisant SQL généré par dynamisme? Query paramétré? Comme Martin demanda, quelle plate-forme et la version DB travaillez-vous? Cela nous dira de savoir quel ensemble de caractéristiques nous devons travailler avec. (XML, UDF, etc.) est une option LINQ-> SQL?


@Martin je travaille sur SQL Server 2005. @toby, j'essaie simplement d'utiliser une requête SQL pour récupérer les lignes qui répondent aux conditions que j'ai mentionnées dans la question.


7 Réponses :


0
votes

Une méthode est xxx


0 commentaires

2
votes

Une manière d'utiliser une table Temp:

DECLARE @t1 TABLE (i INT) 
INSERT @t1 VALUES(2) 
INSERT @t1 VALUES(3)
INSERT @t1 VALUES(6) 
INSERT @t1 VALUES(7)

SELECT i FROM @t1 WHERE i NOT IN (Select Col from Tab)


1 commentaires

J'ai utilisé un exemple ici pour la simplicité. En fait, je m'occupe d'environ 70 valeurs. Écrire 70 insérences déclarations n'est pas vraiment pratique. Je me demande s'il y a un moyen plus simple de le faire. Merci pour la réponse quand même.



3
votes

Méthode SQL Server 2008

DECLARE @Values XML

SET @Values = 
'<r>
    <v>2</v>
    <v>3</v>
    <v>6</v>
    <v>7</v>
</r>' 


SELECT 
    vals.item.value('.[1]', 'INT') AS Val
FROM @Values.nodes('/r/v') vals(item)
EXCEPT
Select Col from Tab


0 commentaires

0
votes

Avez-vous une table [numéros] dans votre base de données? (Voir Pourquoi devrais-je envisager d'utiliser une table des nombres auxiliaires? ) xxx


1 commentaires

Merci d'avoir répondu. Je n'étais pas au courant de cela. Mais, j'ai utilisé un exemple ici pour la simplicité. En fait, je traite de Varcharne et non de chiffres.



3
votes

Le problème, je crois que vous essayez de trouver des valeurs de votre part dans la déclaration. Ce que vous devez faire est de transformer votre instruction dans une table, puis vous pouvez déterminer quelles valeurs sont différentes.

select
 id
from
 dbo.SplitStringToTable('2,3,6,7')
where
 not exists (select 1 from Tab where Col = id)


4 commentaires

J'ai utilisé un exemple ici pour la simplicité. En fait, je m'occupe d'environ 70 valeurs. Écrire 70 insérences déclarations n'est pas vraiment pratique. Je me demande s'il y a un moyen plus simple de le faire. Merci pour la réponse quand même.


Comment déterminez-vous les valeurs?


Je suis désolé d'ajouter le commentaire avant d'essayer la dernière partie de votre réponse, c'est-à-dire de créer une fonction de valorisation de la table pour activer la chaîne séparée des virgules en une table. J'ai essayé cela maintenant, il devient simple une fois que je reçois la liste des valeurs dans une table. Merci.


Excellent, heureux d'avoir pu aider.



0
votes

Je pense qu'il y a beaucoup de façons d'y parvenir, voici un. xxx


0 commentaires

0
votes

en retard à la fête ...

SELECT 
    '2s' = SUM(CASE WHEN Tab.Col = 2 THEN 1 ELSE 0 END),
    '3s' = SUM(CASE WHEN Tab.Col = 3 THEN 1 ELSE 0 END),
    '6s' = SUM(CASE WHEN Tab.Col = 6 THEN 1 ELSE 0 END),
    '7s' = SUM(CASE WHEN Tab.Col = 7 THEN 1 ELSE 0 END)
FROM
(SELECT 1 AS Col, 'Nums' = 1 UNION SELECT 2 AS Col,'Nums' = 1 UNION SELECT 3 AS Col,      'Nums' = 1 UNION SELECT 4 AS Col, 'Nums' = 1 UNION SELECT 5 AS Col, 'Nums' = 1 ) AS Tab
GROUP BY Tab.Nums


0 commentaires