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:
tbl_devices: p>
tbl_devicelocation p>
ce dont j'ai besoin est code> DevelsRnumber code>, Last Qu'est-ce que je Je fais maintenant: p> 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. P> Remarque: il s'agit d'une petite partie d'un grand projet, où elle traitera des millions d'enregistrements. em> p> p> p> Emplacement code>, Dernier jeu d'emplacement
addDateTime code> p>
3 Réponses :
Vous pouvez commencer avec ceci: update strong> p>
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) code> aidera probablement beaucoup.
Un index sur (périphériquesRnumber, addDateTetime) comprend (emplacement) code> sera un encore meilleur, si vous pouvez vous le permettre.
@ ISR5 et vous n'avez pas besoin de la jointure à tbl_devices code>.
@ 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.
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;
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 code> ?? 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 !!!
Essayez ceci, il sélectionnera une seule donnée à l'aide du dernier addDateTetime update strong> p> J'ai essayé cela et il sélectionne un enregistrement distinct Selon le dernier enregistrement. J'espère que cela résoudra p>
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
Avez-vous des
index code> sur
tbl_deviceloation code>?
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 code> est une contrainte i> pas un index i>, 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 .