0
votes

Pourquoi est-ce que je reçois une erreur de nom de colonne en double uniquement lorsque je sélectionne (SELECT)

J'imagine que c'est une surveillance vraiment fondamentale de ma part, mais j'ai une requête SQL qui fonctionne bien. Mais je lorsque je sélectionne à partir de ce résultat (sélectionnez à partir de (SELECT)) CODE> Je reçois une erreur "colonne double". Il existe des noms de colonnes en double, à coup sûr, dans deux tables où je les compare, mais ils ne causent pas de problème dans le résultat initial. Par exemple:

SELECT DISTINCT tag_id, tag FROM (SELECT  _dia_tagsrel.tag_id, _dia_tagsrel.article_id,  _dia_tags.tag
FROM _dia_tagsrel
JOIN _dia_tags
ON _dia_tagsrel.tag_id = _dia_tags.tag_id) a


2 commentaires

Je ne peux que penser que j'ai besoin d'alias les noms de colonne en double dans la requête initiale?


Dans ce dernier cas, vous créez une table dérivée, qui suit la sémantique du tableau. Les noms de colonne doivent être uniques.


3 Réponses :


1
votes

Votre première requête retourne quatre colonnes:

  • tag_id
  • article_id
  • tag_id
  • tag

    Les noms de colonne en double sont autorisés dans un ensemble de résultats , mais ne sont pas autorisés dans une table - ou une table dérivée, vue, vue, vue, vue, cte ou la plupart Les sous-requêtes (une exception sont existez sous-requêtes).

    J'espère que vous pouvez voir le duplicata. Il n'est pas nécessaire de sélectionner tag_id deux fois, car le rejoindre nécessite que les valeurs soient identiques. Donc, il suffit de sélectionner trois colonnes: xxx


2 commentaires

Bonjour, alors - sans renommer les colonnes initiales, rendrais ces colonnes comme des alias fonctionnent? Merci


Merci, je vais marquer cela comme ma réponse. J'avais l'impression que je devais sélectionner les colonnes que j'utilise pour comparer, alors je viens de les laisser sortir. Donc, en fait, il suffit de choisir parmi 2 colonnes - article_id et tag et cela fonctionne.



1
votes

Votre sous-requête a deux tag_id code> s, alors comment le moteur de base de données Décidez lequel vous souhaitez utiliser lequel vous souhaitez utiliser.

Ainsi, utilisez-en un (Joindre requiert TAG_ID CODE> S être identique) ou repamiquez-le: p>

si _dia_tag code> a une balise code> unique code> s puis que vous puissiez utiliser existe code> au lieu de Joindre intérieur Code>: P>

SELECT t.tag
FROM _dia_tags t
WHERE EXISTS (SELECT 1 FROM _dia_tagsrel tr WHERE tr.tag_id = t.tag_id);


0 commentaires

2
votes

In Vous êtes une deuxième requête I.E., la sous-requête, vous sélectionnez deux fois Tag_ID. Bien que cela provienne de deux tables différentes, cela fonctionne de la toile, vous sélectionnez les données. Mais lorsque vous sélectionnez deux fois les colonnes avec le même nom, il vous fournit une erreur en double. Vous trouverez ci-dessous la façon dont vous avez sélectionné la colonne qui est incorrecte _dia_tagsrel.tag_id , _ di_tagsrel.article_id, _dia_tags.tag_id , _dia_tags.tag Tout en utilisant des sous-demandes, fusionner, dans ou existe la clause, évitez d'utiliser les mêmes noms de colonne plusieurs fois.

Une join simple ne fonctionne pas de besoin de subquiery, xxx


2 commentaires

Merci, je me rends maintenant merci en partie à @gordonlinoff que la table dérivée ne puisse pas distinguer les doublons. Je suis donc de les laisser éteindre (car je n'ai besoin que de comparer) ou de créer un alias.


C'est correct Gavin. Pouvez-vous s'il vous plaît fournir un vote up afin que d'autres puissent aussi être utiles