Join On - возвращает оба столбца - PullRequest
0 голосов
/ 21 июня 2019

Я сделал оператор соединения:

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

В результате у меня есть оба столбца: columnX из таблицы table1 и columnY из таблицы table2.Пытался переименовать столбцы, чтобы они имели одинаковые имена, но произошло то же самое.Это довольно странно для меня, пришедшего из Oracle, так как оператор соединения должен действительно объединять таблицы на этом конкретном столбце, не так ли?

Как мне написать объединение, чтобы оставить только один столбец из двух?

РЕДАКТИРОВАТЬ: ДА, я знаю * возвращает все столбцы.Если это не было так очевидно, это то, что я хочу.Вот почему я использовал *, неожиданный сюрприз.Вопрос был в том, как оставить один из дубликатов позади.Вы можете продолжать пожинать, что * вернет все 1000 раз, не поможет без правильного ответа или предложений.

Ответы [ 3 ]

1 голос
/ 21 июня 2019

Вам необходимо указать поля, которые вы хотите вернуть. SELECT * выдаст вам все поля из обеих таблиц (включая обе, перечисленные в JOIN). используйте логику ниже для каждого поля и исключите все, что вы не хотите возвращать.

Я также дал псевдонимы вашим таблицам, чтобы было легче следить за именами столбцов.

    SELECT
     t1.[columnA]
    ,t1.[columnB]
    ,t1.[columnC]
    .
    .
    .
    ,t2.[columnA]
    ,t2.[columnB]
    ,t2.[columnC]
    FROM dbo.table1 t1
    INNER JOIN dbo.table2 t2 ON t1.[columnX] = t2.[columnY]

Альтернативой, если вы действительно не хотите перечислять все столбцы, было бы SELECT * INTO временной таблицы, удаление ненужных столбцов из временной таблицы и затем SELECT * из временной таблицы, найденный здесь ( /557624/sql-isklychaet-stolbets-ispolzuya-select-krome-columna-from-tablea) и я добавлю ниже общий сценарий на случай, если ссылка когда-либо умрет вместе с конкретной, чтобы сопоставить вашу таблицу с объединением.

Хотя это будет работать, я бы предложил использовать только SELECT * для быстрой проверки на лету, если это является частью процедуры или представления, или что-то, что используют другие процессы, SELECT * может вызвать проблемы / сбои при сбое если структура исходной таблицы (таблиц) изменяется, и последующие шаги в процессе не ожидают нового изменения. например поле удалено из источника, view больше не выбирает его как часть SELECT *, и процедура завершится ошибкой, так как ожидает его как часть задачи INSERT.

Полезное правило для меня - всегда указывать, какие столбцы мне нужны в любом запросе, кроме проверки данных на лету.

Общая версия для синтаксиса;

    /* Get the data into a temp table */
    SELECT * INTO #TempTable
    FROM YourTable
    /* Drop the columns that are not needed */
    ALTER TABLE #TempTable
    DROP COLUMN ColumnToDrop
    /* Get results and drop temp table */
    SELECT * FROM #TempTable
    DROP TABLE #TempTable

Настраиваемая версия в соответствии с вашими потребностями с объединенными таблицами;

    /* Get the data into a temp table */
    SELECT * INTO #TempTable
    FROM [dbo].[table1] a
    JOIN [dbo].[table2] b ON a.[columnX] = b.[columnY]
    /* Drop the columns that are not needed */
    ALTER TABLE #TempTable
    DROP COLUMN [columnX]
    /* Get results and drop temp table */
    SELECT * FROM #TempTable
    DROP TABLE #TempTable

Я нашел более элегантный способ по той же ссылке, что и выше, которую вы можете ВЫБРАТЬ * динамически с помощью нижеприведенного (опять же, я не одобряю SELECT *);

    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);
1 голос
/ 21 июня 2019

Я думаю, что вы ищете это:

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

Этот оператор будет возвращать все столбцы в таблице1, где условие соединения выполняется, т. Е. Все записи в таблице1, где columnx = столбец.

1 голос
/ 21 июня 2019

Ваш SELECT * означает возврат всех столбцов из всех таблиц, на которые есть ссылки в таблицах FROM и JOIN.

Это эквивалент:

SELECT table1.*, table2.*
FROM table1 
JOIN table2
ON table1.columnX = table2.columnY

Так что просто измените SELECT на ваши явные столбцы:

SELECT table1.columnX
FROM table1 
JOIN table2
ON table1.columnX = table2.columnY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...