Afficher le nom de l'utilisateur et sa ville qui ont réservé leurs billets sans utiliser la banque HDFC pour aucune des réservations. Triez le résultat en fonction du nom d'utilisateur.
Ceci est le schéma Ceci est mon code.
NAME ADDRESS ---------------- ---------- Johan Delhi John Bangalore Krena Mumbai
J'obtiens la sortie attendue mais je ne passe qu'un seul des cas de test (je ne peux pas voir les cas de test car il ne montre que la réussite ou l'échec). Je pense que cette requête peut être écrite de manière plus efficace.
Données pour la table des utilisateurs.
BD_ID ACC_NO NAME USER_ID ------- ------ ---- --------- 1001 1234 SBI 1 1002 5623 KVB 5 1003 9876 ICICI 4 1004 9193 HDFC 2 1005 8397 HDFC 3 1006 1234 SBI 1
Données pour le tableau des détails de réservation.
NAME USER_ID ADDRESS ------------------- ---------- --------- Jaya 6 Chennai Krena 5 Mumbai Johan 4 Delhi Ivan 3 Chennai Tom 2 Hyderabad John 1 Bangalore
production attendue:
select distinct u.name,u.address from users u join bookingdetails b on b.user_id=u.user_id where lower(b.name) !='hdfc' order by u.name;
il s'agit également de la sortie (donnée ci-dessus) de votre requête modifiée et elle ne transmet également qu'un seul cas de test.
3 Réponses :
Comme vous n'avez besoin que des colonnes d'une table ( users
), vous pouvez convertir votre requête en NOT EXISTS
select u.name,u.address from users u where exists ( select 1 from bookingdetails b where b.user_id=u.user_id and lower(b.name) != 'hdfc' ) order by u.name;
En outre, l'ajout de lower()
peut dégrader les performances si le volume de données est élevé et ne peut pas utiliser un index s'il existe sur le nom. Ainsi, dans un scénario en temps réel (contrairement à l'affectation que vous essayez actuellement de terminer), stockez les noms dans une seule casse (inférieure ou supérieure) ou utilisez un index basé sur une fonction sur lower(name)
.
MODIFIER : Si vous souhaitez exclure les utilisateurs qui ne sont pas présents dans les détails de la réservation, vous pouvez utiliser votre requête d'origine ou une condition d'existence.
select u.name,u.address from users u where not exists ( select 1 from bookingdetails b where b.user_id=u.user_id and lower(b.name) ='hdfc' ) order by u.name;
Après avoir évalué cette requête, j'obtiens une sortie incorrecte. Comme il ne devrait pas y avoir le nom de Jaya dans la table de sortie. pour plus de détails, vous pouvez vérifier les données du tableau. (donnée ci-dessus ).
@SakshiNegi: D'après ce que je peux voir sur cette capture d'écran, l'utilisateur Jaya (user_id 6) n'a pas d'entrée dans la banque HDFC, qu'espérez-vous voir?
nous devons afficher le nom et la ville de «Johan», «john» et «krena». aussi à partir de la requête ci-dessus écrite par moi montre le résultat attendu et il ne passe qu'un seul cas de test mais ne montre même pas quels sont les cas de test
KaushikNayak: J'avais déjà effectué cette requête. Et cela donnait une sortie incorrecte.
@SakshiNegi: Une chose importante qui n'a pas été soulignée jusqu'à présent est que si vous voulez que nous fournissions une solution de travail, vous devez ajouter les exemples de données et la sortie attendue sous forme de texte et non d'images. Comment pourrions-nous recréer les SQL en utilisant ces images? Dans quelle mesure vous serait-il utile que nous publiions des réponses sous forme de captures d'écran? Vous avez la chance que votre question ne soit pas encore rejetée en raison de l'ajout d'images. Donc, si vous vous attendez à ce que nous vous fournissions des solutions, ajoutez des exemples de données au format tabulaire sous forme de texte brut uniquement.
@SakshiNegi: Eh bien, ma deuxième requête semble vous donner le même résultat, vérifiez le lien de démonstration. Je ne sais pas ce que vous entendez par "il ne réussit qu'un seul cas de test mais ne montre même pas quels sont les cas de test" . Dans quel contexte parlez-vous?
select distinct u.name, u.address from users u join bookingdetails b on b.user_id = u.user_id where u.user_id not in ( select user_id from bookingdetails where name='HDFC') order by u.name; This will hopefully pass both of your test cases.
Je ne sais pas quels sont les cas de test ... tous à cause de cela, je ne suis pas en mesure de trouver ce qui me manque dans ma requête. mais à part cela, cette requête ne passe également qu'un seul cas de test.
@SakshiNegi: C'est étrange, car j'ai réussi les deux tests avec succès. Vérifiez les captures d'écran: imgur.com/a/EoLLIEN . Si cela n'a pas fonctionné pour vous, n'hésitez pas à me contacter.
select distinct u.name, u.address from users u join bookingdetails b on b.user_id = u.user_id where u.user_id not in (select user_id from bookingdetails where name = 'HDFC') order by u.name; This gives the correct answer as provided above and both test cases will sure be passed
L'ajout de liens externes et d'images est une mauvaise pratique lorsque vous posez une question. Lisez ceci attentivement. Tous ne pourront pas se connecter à ces liens externes ou télécharger des images à partir de ceux-ci en raison des restrictions appliquées (des administrateurs Internet locaux sur le lieu de travail, etc.). Même s'ils le peuvent, il sera difficile de recréer le scénario à partir de ces images.
d'accord. Je n'étais pas au courant des choses à faire et à ne pas faire.
Génial, vous avez maintenant ajouté la sortie attendue au format texte. Mais, il est important d'ajouter des exemples de données à partir des deux tables (utilisateurs et détails de réservation) de la même manière. C'est plus essentiel que la sortie attendue car c'est ce qui nous permet de recréer le scénario et de vous donner une solution fonctionnelle.
Oui. J'ai édité. vérifiez les modifications maintenant !!
"avoir réussi un seul des cas de test (ne peut pas voir les cas de test car il ne montre que la réussite ou l'échec)" Les tests unitaires ne vous donnent donc aucune indication sur les raisons de l'échec du test? C'est une pratique extrêmement médiocre. De plus, impossible pour nous de vous dire comment changer votre code pour réussir ces tests si vous ne pouvez pas nous indiquer les critères que vous devez corriger.