Question

Comment sélectionnez-vous tous les champs de deux tables jointes, sans avoir des conflits avec le champ commun?

Supposons que j'ai deux tables, Products et Services. Je voudrais faire une requête comme ceci:

SELECT Products.*, Services.* 
FROM Products 
INNER JOIN Services ON Products.IdService = Services.IdService

Le problème avec cette requête est que IdService apparaît deux fois et conduire à un tas de problèmes.

L'alternative que je trouve à ce jour est de distinguer tous les domaines de la Products sauf IdService un. Mais cette façon je vais devoir mettre à jour la requête chaque fois que j'ajouter un nouveau champ à Products.

Y at-il une meilleure façon de le faire?

Était-ce utile?

La solution

Quels sont les anti-modèles SQL la plus courante

Vous avez touché anti-modèle n ° 1.

La meilleure façon est de fournir une liste des champs. Une façon d'obtenir une liste rapide sur le terrain est à

sp_help tablename

Et si vous voulez créer une vue de cette requête - en utilisant select * vous obtient plus d'ennuis. SQL Server capture la liste des colonnes au moment où la vue est créée. Si vous modifiez les tables et ne pas recréer la vue sous-jacents - vous signez pour des problèmes (j'ai eu un feu de production de cette nature - vue était contre des tables dans une autre base de données bien).

Autres conseils

Vous ne devriez jamais avoir SELECT * dans le code de production (bien, presque jamais, mais les temps où il est justifié peut être facilement pris en compte).

Pour autant que je suis conscient que vous devrez éviter SELECT * mais this't vraiment un problème.

SELECT * est généralement considérée comme un problème qui devait arriver pour la raison que vous citez comme un avantage! Habituellement, des colonnes supplémentaires de résultats pour les requêtes qui apparaissent lorsque la base de données a été modifiée causera des problèmes.

Votre dialecte de COMPOSER support SQL? COMPOSER se débarrasse de la copie supplémentaire de la colonne qui est utilisé sur une équijointure, comme celui de votre exemple.

Comme d'autres l'ont dit le Select * est de mauvaises nouvelles, surtout si d'autres champs sont ajoutés aux tables où que vous interrogez. Vous devez sélectionner les champs précis que vous voulez à partir des tables et peut utiliser un alias pour les champs avec les mêmes noms ou tout simplement utiliser table.columnName.

Ne pas utiliser *. Utilisez quelque chose comme ceci:

SELECT P.field1 AS 'Field from P'
     , P.field2
     , S.field1 AS 'Field from S'
     , S.field4 
  FROM Products P
       INNER JOIN 
       Services S
       ON P.IdService = S.IdService

Ce serait correct, la liste des champs que vous souhaitez (dans SQL Server, vous pouvez les faire glisser à partir du navigateur d'objets, de sorte que vous n'avez pas à les taper tous). Soit dit en passant, s'il y a des champs de votre doe de requête spécifique pas besoin, ne les liste pas. Cela crée un travail supplémentaire pour le serveur et utilise les ressources réseau supplémentaires et peut être l'une des causes de la mauvaise performance quand il est fait thoughout votre système et ces requêtes inutiles sont exécutés des milliers de fois par jour.

En ce qui étant un problème de maintenance, il vous suffit d'ajouter les champs si la partie de l'application qui utilise votre requête serait affectée par eux. Si vous ne savez pas quel effet le nouveau champ aurait ou si vous devez l'ajouter, vous ne devriez pas être ajouter le champ. En outre l'ajout de nouveaux fileds unexopectedly par l'utilisation de select * peut causer des problèmes de maintenance ainsi. Création des problèmes de performance pour éviter l'entretien faire (entretien vous ne même pas besoin de faire comme les changements de colonne devraient être rares (si elles ne sont pas que vous devez regarder votre conception)) est assez courte vue.

La meilleure façon est de préciser les champs exacts que vous voulez de la requête. Vous ne devriez pas utiliser * de toute façon.

Il est commode d'utiliser * pour obtenir tous les champs, mais il ne produit pas de code robuste. Toute modification de la table changera le résultat renvoyé par la requête, et qui ne sont pas toujours souhaitable.

Vous devez retourner uniquement les données que vous voulez vraiment de la requête, spécifiée dans l'ordre exact que vous voulez. De cette façon, le résultat est exactement le même, même si vous ajoutez des champs à la table ou de modifier l'ordre des champs de la table.

Il est un litte plus de travail pour spécifier la sortie exacte, mais à long terme, il paie habituellement hors tension. Lorsque vous faites un changement, que ce que vous réellement changer est affecté, vous ne que vous ne savez même pas d'effets en cascade obtenez qui brise le code a été affectée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top