-3
votes

Joindre sur - retourne les deux colonnes

J'ai fait une déclaration de jointure:

SELECT * 
FROM dbo.table1 a
JOIN dbo.table2 b ON a.[columnX] = b.[columnY]


7 commentaires

Peut-être que vous voulez ceci: Sélectionnez Table1.Columnx de dbo.table1 Rejoignez dbo.table2 sur (dbo.table1. [Columnx] = dbo.table2. [Columny])


Je ne sais pas quelle est votre question, mais au lieu de Select * à partir de Vous devez sélectionner uniquement les colonnes que vous souhaitez figurer dans le résultat et vous pouvez leur donner n'importe quel nom que vous souhaitez.


@isaacei a beaucoup de colonnes, donc je ne peux donc pas les énumérer manuellement. Je veux juste rejoindre les deux tables sur les valeurs communes tout en obtenant le reste des colonnes de la table.


Pour être honnête, je ne comprends pas votre question. Quel est exactement le problème?


@Mattsom Si vous voulez toutes les colonnes des deux tables, la requête que vous avez fournie est correcte. Si le Select * ne renvoie que deux colonnes, c'est parce que vos tables ne contiennent que 1 colonne.


Encore une fois, SELECT * à partir de retournera toutes les colonnes de toutes les tables, y compris les colonnes utilisées pour rejoindre 2 tables . Si vous voulez quelque chose d'autre, vous devrez être plus spécifique dans votre Sélectionner .


Je ne sais pas pourquoi vous avez bownvote pour une raison quelconque. Il est clair que je veux garder toutes les colonnes après la jointure, juste sans aucune duplication sur la colonne, elle a été jointe.


3 Réponses :


1
votes

Votre SELECT * signifie renvoyer toutes les colonnes de toutes les tables référencées dans le dans et joindre Tables.

C'est l'équivalent de : xxx

modifier simplement le sélectionnez à vos colonnes explicites: xxx


7 commentaires

Mais j'ai besoin de toutes les autres colonnes. Sélectionner juste colonne ne me donne rien, mais cette colonne.


Si vous laissez votre sélection comme SELECT *, vous retournerez toutes les colonnes des tables de votre mode de route et de votre jointure. Si vous voulez toutes les colonnes, la requête de votre message d'origine est correcte. Pour être aussi précis que possible, placez la structure de table des deux tables de votre poste et de la sortie attendue.


J'ai d'innombrables attributs dans les deux tables, il n'est donc pas logique de produire cela dans la question. Je veux avoir toutes les colonnes, les colonnes d'A et de B, jointes par la colonne sélectionnée.


@Mattsom Il n'y a vraiment pas une autre façon de le dire. Je l'ai dit dans mes commentaires, les gens l'ont dit dans vos commentaires sur votre poste d'origine. Si vous avez sélectionné *, toutes les colonnes de Tableau1 et Table2 seront dans votre sortie. Je ne comprends pas ce que tu ne comprends pas. Si vous voulez toutes les colonnes, sauf pour une certaine colonne, vous devez donc les énumérer explicitement.


Je comprends ça, c'est ce dont j'ai besoin. De plus, j'ai dit que je ne veux que les colonnes dupliquées que j'ai rejoint les tables. La question est de savoir comment le faire. Au lieu d'aider avec cela, je continue à lire * obtient tout, comme si je l'aurais pu le savoir. Vous pouvez continuer à revot, mais cela fait de zéro aide et est simplement un mouvement enfantin. Juste ne pas contribuer à la place, aucun problème ne vient de cela.


@Mattsom Si vous voulez toutes les colonnes, vous obtiendrez les deux colonnes que vous avez jointes. Si vous ne voulez que 1 de ceux-ci, de table1 ou de table2, vous devrez sélectionner T1. *, T2.Col1, T2.Col2 ..... T2.Coln. SQL Server n'a pas le moyen de dire sélectionner


@dfundanko merci! C'était une bonne réponse que je cherchais! Je ne comprends tout simplement pas pourquoi était-ce si difficile à comprendre au lieu de me descendre. Les gens commencent toujours à dire que toutes vos colonnes seront plus spécifiques, comme les personnes ne pouvaient pas avoir 300 colonnes dans une table pour travailler.



1
votes

Vous devez spécifier les champs que vous souhaitez revenir. Un Select * vous donnera tous les champs des deux tables (y compris les deux dans la jointure). Utilisez ci-dessous la logique pour chaque champ et excluez-vous que vous ne voulez pas être retourné.

J'ai également donné des alias à vos tables pour que les noms de colonne facilitent la suivi. P>

    declare @cols varchar(max), @query varchar(max);
    SELECT  @cols = STUFF
        (
            ( 
                SELECT DISTINCT '], [' + name
                FROM sys.columns
                where object_id = (
                    select top 1 object_id from sys.objects
                    where name = 'MyTable'
                )
                and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
                FOR XML PATH('')
            ), 1, 2, ''
        ) + ']';

    SELECT @query = 'select ' + @cols + ' from MyTable';  
    EXEC (@query);


2 commentaires

Mais si si T1 et T2 se compose d'innombrables colonnes? Dois-je vraiment les énumérer manuellement?


vous pouvez sélectionner * dans une table Temp, déposer le (s) que vous ne voulez pas de la table Temp, puis sélectionnez-le dans la table Temp, je modifierai ma réponse à inclure où j'ai trouvé et ce qu'il était (comme Les liens peuvent mourir)



1
votes

Je pense que ce que vous cherchez, c'est que:

select  a.* 
from    dbo.table1 a
JOIN    dbo.table2 b
        ON a.[columnX] = b.[columnY]


0 commentaires