Sélectionnez les valeurs ne sont pas dans une certaine plage dans une table
J'ai une table avec une colonne d'id et des centaines de milliers de lignes. J'ai reçu une liste de plus de 1000 Id pour vérifier les autres données de la table contre. Les Id ne sont pas stockées dans l'ordre. La liste d'Id n'est pas dans l'ordre. Lorsque je sélectionne les données de la table à l'aide de ces identifiants seulement 990 résultats sont retournés, signification depuis que la liste a été produit, de 10 les résultats ont changé/été supprimé. Comment puis-je trouver les 10 valeurs manquantes à partir de cette plage de données? C'est ce que je fais en ce moment:
select * from mytable
where theId in (100, 2223, 31, 43321...92199, 14000)
Renvoie la 990 résultats. Puis-je faire quelque chose comme:
select val from (1, 2, 3, 4...999, 1000)
where val not in (
select * from mytable
where theId in (1, 2, 3, 4...999, 1000)
)
EDIT: Désolé pour la confusion. Je devrais avoir mentionné que les ID ne sont pas dans un ordre particulier et j'étais juste en utilisant le nombre 1000, comme un exemple. Ils sont dans un ordre aléatoire et le 1000 est juste un choix beaucoup plus grand de table (de 100 000 s de lignes).
Exactement. Mais je veux savoir ce que les personnes disparues Id. Parce qu'ils ont été à un certain moment et sont maintenant disparus.
Mais sûrement, ils pourraient être aucun de l'autre de 99 000-odd dossiers? Quand étaient-ils là? Si quelqu'un a supprimé 10 enregistrements, alors je dirais de vérifier vos sauvegardes et des journaux de transaction parce que vous ne pouvez pas
SELECT
des dossiers manquants!Ouais je le comprends. Si j'ai 1000 id de l'origine, et maintenant à la recherche de tous les records avec ces identifiants retourne 10 de moins, cela signifie que 10 sont manquantes à partir de l'intérieur de cette fourchette. L'autre de 990 000 ou si les dossiers ne sont pas affectés parce que leurs papiers d'identité ne sont pas tout l'un des 1000 donné à moi. Je vais en bas de la route de permettre à celles-1000 Id dans une autre table à comparer. Ne peux pas penser à une solution plus simple.
OriginalL'auteur edwardmlyte | 2011-10-04
Vous devez vous connecter pour publier un commentaire.
Il pourrait y avoir des cas comme il n'existe pas de n'importe quel enregistrement pour les personnes disparues id ou il peut être avez d'autres id comme inférieur à 1 ou supérieur à 1000. Si la table n'ont 1000 enregistrements et que vous avez seulement 990 dossiers dans votre requête, puis définitivement des dossiers manquants id qui est inférieur à 1 ou supérieur à 1000. Si ces documents manquants ne seront venir dans la requête suivante :
Mise à JOUR :
Aléatoire identifiants, vous pouvez les faire comme :
Ainsi, vous pouvez ajouter une condition comme val >= 1 et val <= 1000. Encore si vous obtenez 990 enregistrements alors cela signifie que vous avez seulement 990 dossiers entre 1 à 1000.
Les Id ne sont pas dans l'ordre et ne sont pas nécessairement compris entre 1 et 1000. J'ai été plus d'essayer de l'obtenir à l'échelle qui était désireux de recherche dans un rayon de 1000 valeur à partir d'une beaucoup plus grande table.
Vérifier mes mises à jour de réponse.
Ouais c'est le genre de chose que je veux.
OriginalL'auteur Upendra Chaudhari
Je suggère quelque chose comme ceci:
OriginalL'auteur Rikon
Pouvez-vous créer une table temporaire et de mettre les 1000 ID est en elle? Ensuite, vous utilisez la logique que vous avez suggéré, un peu comme ceci:
OriginalL'auteur Aleks G
Avez-vous vraiment obtenir les 1000 dossiers? Et si ses une plage que vous pourriez essayer avec cette instruction where...
Sinon c'est que vous pourriez utiliser cette requête pour exclure les "trouvé" une fois...
BETWEEN 1 AND 1000
est beaucoup plus proprehypercrypt vous avez raison, mais je ne savais pas, sans demander à google que entre est la partie de la norme ansi-92 sql standart ou pas... 😉
OriginalL'auteur Yves M.
Si vous voulez trouver les Id qui sont PAS dans votre liste, puis:
En aparté, si votre (entier) Id de vraiment faire exécuter à partir de 1-1000, sans lacunes, vous pouvez utiliser
OriginalL'auteur Widor
vous pouvez tirer
Si vous êtes sur oracle, vous pouvez:
et la colonne diff_from prochaine sera différente de ses voisins.
OriginalL'auteur Florin Ghita
La réponse que j'ai donné à la question suivante devrait vous aider - vous utiliser une expression de table commune pour obtenir une liste d'Identifiants et de les comparer à l'Id dans la table:
Comment puis-je obtenir le "Prochain numéro" à partir d'un Serveur SQL? (Pas une colonne d'Identité)
OriginalL'auteur Jon Egerton
Écrit pour mssql 2005
vous pouvez changer de 1000 à le nombre dont vous avez besoin. La partie supérieure est juste le remplissage de données à des fins de test. Puisque vous êtes à la recherche pour tous les "trous" dans les id c'est la meilleure solution pour votre senario. Si vous avez seulement besoin de le premier "trou", la requête serait de beaucoup de choses différentes. Vous pouvez aussi remplacer le 1000 avec une valeur max de yourtable
OriginalL'auteur t-clausen.dk