SQL - Почему нет способа ВЫБРАТЬ ВСЕ, кроме этого столбца - PullRequest
1 голос
/ 01 марта 2011

Мой общий вопрос заключается в том, что я хочу выбрать все столбцы в левом соединении, и мне не нужно знать идентификатор, который объединяет две таблицы.Я знаю, что нет необходимости выбирать все, но так как вам нужны все поля, кроме идентификаторов, почему нет более короткого способа: SELECT *, кроме «этого столбца», я чувствую, что время действия должно быть меньшеобратный путь?

T1:
aID,
c1,
c2,
c3,
c4

t2:
aID,
c1,
c2,
c3,
c4

Select * from t1 left join t2 on t1.aid = t2.aid

result: t1:aid, c1, c2, c3, c4, aid, c1, c2 ,c3 ,c4

вместо того, чтобы выбирать каждый столбец, который я хочу, я просто хочу выбрать все, кроме «помощь».

Ответы [ 5 ]

6 голосов
/ 01 марта 2011

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

После того, как вы правильно сформировали свой запрос (получили правильные соединения и т. Д.), Вы должны вернуться к предложению SELECT и явно перечислить те столбцы, которые вы действительно хотитеизвлечения.Извлечение большего количества столбцов, чем вам нужно (включая неожиданные новые), может привести к тому, что SQL Server придется использовать менее эффективный план или извлекать огромные объемы данных, которые потребитель никогда не будет использовать.

0 голосов
/ 01 марта 2011

Похоже, что вы ищете, это NATURAL JOIN.

0 голосов
/ 01 марта 2011

По той же причине, что SELECT * не очень хорошая идея. Использование SELECT * в ваших запросах может быть в лучшем случае раздражающим, а в худшем - опасным. Если к таблице или источнику данных вы запрашиваете изменения, это может привести к неожиданному поведению.

0 голосов
/ 01 марта 2011

Преждевременная оптимизация - корень всего зла (или, по крайней мере, большей его части) в программировании.- Дональд Э. Кнут

Почему вас волнует, будет ли возвращен столбец идентификатора или нет?

Кроме того, да, это может быть немного упущением в дизайне SQL.

0 голосов
/ 01 марта 2011

Я не слишком уверен, что это действительно возможно.Возможно, вы захотите посмотреть на динамический запрос в этом случае, когда все столбцы из двух соединяющих таблиц будут включены в запрос, кроме внешнего ключа.

Можно даже написать своего рода процедуру, которая принимает параметры для @ Table1, @ Table2, @PK, @FK, а затем динамически формирует запрос на основе предоставленных параметров.

...