0
votes

Comment obtenir un seul disque de la table gauche contre chaque enregistrement de la bonne table

J'ai deux tables, une pour une sorte d'appareils et l'autre pour leurs emplacements (en utilisant ce tableau pour conserver une trace d'historique de localisation). Les schémas des tables sont:

  1. tbl_devices:

    • dispositifsRnumber (Bigint, pas NULL, PK)
    • d'autres colonnes
    • tbl_devicelocation

      • srnumber (Bigint, pas null, pk, identité)
      • dispositifsRnumber (Bigint, pas NULL)
      • Emplacement (Varchar (300), Not Null)
      • AddDationTime (DateTime, Not Null)

        ce dont j'ai besoin est DevelsRnumber , Last Emplacement , Dernier jeu d'emplacement addDateTime

        Qu'est-ce que je Je fais maintenant: xxx

        mais j'ai besoin de le faire avec une jointure de manière plus propre, car, selon ma connaissance, une sous-requête n'est pas efficace et non recommandée dans une base de données à grande échelle.

        Remarque: il s'agit d'une petite partie d'un grand projet, où elle traitera des millions d'enregistrements.


4 commentaires

Avez-vous des index sur tbl_deviceloation ?


Oui. J'ai une index clustered sur SRNumber (Bigint, pas NULL, Identity, PK) et également une chèque sur la colonne "Emplacement". Mais cela a-t-il quelque chose à voir avec notre problème.


Le vérifier est une contrainte pas un index , vous n'avez donc qu'un seul index.


La performance des sous-requêtes dépend de la requête et de l'optimiseur. Comme dans chaque problème d'optimisation, il convient de mesurer en pratique et d'autres options. Bien sûr, il existe des tendances documentées et observées / hypothétiquées pour une mise en œuvre particulière - nous pouvons ici soupçonner que certains copains peuvent ne pas être bien optimisés et recherchent une seule mention de tbl_devicelocation, probablement via une jointure. Qu'avez-vous essayé comme ça? PS Clarifiez via des modifications postales, pas des commentaires. Aussi pour les questions de code donnez un exemple de reproductible minimal .


3 Réponses :


1
votes

Vous pouvez commencer avec ceci: xxx

update xxx


13 commentaires

Cher @ ISR5, je ne veux pas que des endroits ajoutés dans les 24 dernières heures, j'ai besoin d'un emplacement de chaque périphérique et de son temps, sans aucune inquiétude, elles étaient à la mise à jour des dernières 24 heures ou non.


@Ariarslan Retirez ensuite la clause WHERE, cela saisira tous les appareils avec leurs emplacements et son temps.


Juste pour le faire clair à nouveau, je voulais le dernier emplacement, pas tous les emplacements attribués à un périphérique.


@Raiarslan revérifier la requête, j'ai mis à jour. Est-ce ce dont vous avez besoin ?


Cher @ ISR5, je ne voulais pas utiliser une sous-requête. Il produit le même résultat que ma requête initiale. Faites-moi savoir s'il y a un moyen de le faire en utilisant des jointures. Si oui s'il vous plaît dites-moi.


Cher ça ne fait pas aider. Veuillez regarder le résultat de la requête de travail existante. | DispositifsRnumber | Lieu | AddDateTime | | 100230952234 | Franchise | 2019-01-04 15: 27: 47.050 | | 100232000000 | Franchise | 2019-01-04 15: 27: 47.057 | | 100232000001 | Franchise | 2019-01-04 15: 27: 47.063 | | 100232000002 | Franchise | 2019-01-04 15: 27: 47.070 | | 100232000003 | Franchise | 2019-01-04 16: 09: 57.917 | | 100232000004 | Région | 2019-01-04 17: 14: 59.637 | | 100232000005 | Franchise | 2019-01-04 16: 09: 57.923 | | 100232000006 | Franchise | 2019-01-04 16: 40: 15.590 |


@AriarSlan Pour vous aider à mieux vous aider, veuillez mettre à jour votre message avec un échantillon et vos résultats attendus de cet échantillon.


La première requête a l'air bien envers moi. Il est un moyen très courant de traiter ce type de problèmes dans SQL Server et généralement assez efficace, avec une indexation appropriée. Dans ce cas, un index sur (périphériquesRnumber, addDateTetime) aidera probablement beaucoup.


Un index sur (périphériquesRnumber, addDateTetime) comprend (emplacement) sera un encore meilleur, si vous pouvez vous le permettre.


@ ISR5 et vous n'avez pas besoin de la jointure à tbl_devices .


@ Yper-Crazyhat-cubeᵀᴹ Eh bien, il pourrait être nécessaire et utilisé en réalité dans la requête finale, mais l'OP pourrait simplement le simplifier pour que nous puissions éviter la complicité. Nous tenons donc à ce que nous avons, si nous connaissons une connaissance complète sur la logique et les exigences de cette requête, nous pouvons décider, ce qui est nécessaire et qui n'est pas.


J'ai évoqué votre réponse parce que la première requête est bonne. La 2e requête (après «mise à jour») est clairement incorrecte et doit être retirée.


Cher @ ISR5 Merci pour votre soutien. Votre première requête était tellement aidante. Mais j'ai eu peu de temps quand j'ai posé cette question. Je n'avais pas de solution et je devais devenir un goulot d'étranglement pour toute la livraison du projet. Puis, finalement, j'ai décidé d'aller avec la sous-requête, une solution de travail mais méchant (IMHO). Maintenant, j'ai décidé de comparer votre requête avec la mienne et de le trouver sauveur de la vie. Je vais le remplacer dans le prochain Cr. Merci pour votre réponse.



1
votes

Votre requête sera beaucoup plus efficace de cette façon:

SELECT D.DeviceSrNumber, 
       L.Location, 
       L.AddDateTime 
FROM        tbl_Devices D
OUTER APPLY
   (SELECT TOP (1) DL.Location, DL.AddDateTime
    FROM tbl_DeviceLocation DL
    WHERE D.DeviceSrNumber = DL.DeviceSrNumber
    ORDER BY DL.AddDateTime DESC
   ) L;


7 commentaires

Vous manquez quelque chose dans le dernier.


Je pense que vous vous référez à une parenthèse de fermeture. Oui, j'ai déjà ajouté, merci beaucoup !!!


Tu ne manques rien d'autre? Par exemple: l.location ?? L ??


Droite, c'est l'équivalent sémantique. Désolé, j'ai peut-être supposé qu'il y avait toujours un emplacement pour chaque appareil


Toujours besoin d'un alias @ yper-crazyhat-cubeᵀᴹ


J'ai pris la liberté de corriger les problèmes mentionnés dans les commentaires, mais s'il vous plaît jetez un coup d'œil à vous-même. La méthode elle-même a du sens, cela a juste eu un certain nombre de problèmes et je pense que tous les points ont été abordés maintenant. N'hésitez pas à modifier davantage le besoin


Merci beaucoup !!! Oui, j'étais dans plusieurs articles en même temps et je ne suis pas assez concentré sur la réponse correctement. Heureux que plusieurs personnes ont réalisé et amélioré la réponse !!!



-1
votes

Essayez ceci, il sélectionnera une seule donnée à l'aide du dernier addDateTetime xxx

update

J'ai essayé cela et il sélectionne un enregistrement distinct Selon le dernier enregistrement. J'espère que cela résoudra xxx


2 commentaires

Cher @muhdamean, cela ne fonctionnerait pas, car nous devons répertorier tous les appareils avec leurs emplacements.


J'ai essayé d'utiliser une autre méthode et cela fonctionne pour moi gentiment l'essayer. @Raiarslan