Каковы технические различия между "select * from table_name a" и "select a. * From table_name a"? - PullRequest
0 голосов
/ 26 ноября 2018

Это может быть основной вопрос, но я не могу найти объяснения после поиска в Google.

В любом случае, небольшая предыстория.У меня есть таблица, которую я не могу изменить в DB2:

other_field |  date_field  | time_field
---------------------------------------
     1      |    180101    |   101010
     2      |    180102    |   202020
     3      |    180103    |   303030
     4      |    180104    |   404040

Я пытался использовать:

select *, concat(date_field, time_field) as TIME
from Table_Name

Мой ожидаемый результат: отображает примерно так:

other_field |  date_field  | time_field |     TIME
--------------------------------------------------------
     1      |    180101    |   101010   | 180101101010
     2      |    180102    |   102020   | 180102102020
     3      |    180103    |   103030   | 180103103030
     4      |    180104    |   104040   | 180104104040

Но я не могу использовать этот запрос по какой-то причине.Это дало мне ошибку ...Token , was not valid. Valid tokens: FROM INTO, в которой в основном говорилось, что запятая (,) после * недействительна.

Затем я попытался немного изменить ее:

select a.*, concat(a.date_field, a.time_field) as TIME
from Table_Name a

И это работает!

Я понимаю, что Table_Name a часто используются для объединения таблиц, но мне любопытно, какой механизм лежит в основе.

Каковы технические различия между использованием Table_Name и Table_Name a?И как это a называется?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Db2 (LUW) 11.1 поддерживает этот синтаксис

create table Table_Name (
   other_field int not null primary key
,  date_field date not null
,  time_field time not null 
)
;
insert into Table_Name values 
    (1,'2018-01-01', '10.10.10')
,   (2,'2018-01-01', '20.20.20')
,   (3,'2018-01-01', '13.13.13')
,   (4,'2018-01-01', '14.14.14')
;
select *, timestamp(date_field, time_field) as TIME from Table_Name
;

, который будет возвращать

 OTHER_FIELD    DATE_FIELD  TIME_FIELD  TIME
 -----------    ----------  ----------  ---------------------
           1    2018-01-01  10:10:10    2018-01-01 10:10:10.0
           2    2018-01-01  20:20:20    2018-01-01 20:20:20.0
           3    2018-01-01  13:13:13    2018-01-01 13:13:13.0
           4    2018-01-01  14:14:14    2018-01-01 14:14:14.0

Кстати, я позволил себе использовать разумные типы данных для вашего примера.Используйте DATE1, TIME и TIMESAMP (или TIMESTAMP(0)) для работы со значениями даты и времени ...

0 голосов
/ 26 ноября 2018

Технически не будет никакой разницы между операциями SELECT * FROM TAB_NAME и SELECT a,* FROM TAB_NAME a.

Здесь вы просто указываете псевдоним.

Но вы можете понять разницу, когда вы будетепопробуйте получить другой столбец с * из TAB_NAME.Это означает, что если вы хотите ввести данные как

SELECT *,COL_1,COL2... 
FROM TAB_NAME 

или

SELECT *,CONCAT(...) 
FROM TAB_NAME

или что-то с *, вы должны указать псевдоним.

Но вопрос в том, почему?Позвольте мне попытаться объяснить,

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

НО теперь вопрос в том, как будет работать внутренний запрос

SELECT a.*,COL_1,COL2... 
FROM TAB_NAME a

или

SELECT a.*,a.COL_1,a.COL2... 
FROM TAB_NAME a

или

SELECT a.*,CONCAT(c1,c2) 
FROM TAB_NAME a

или

SELECT a.*,CONCAT(a.c1,a.c2) 
FROM TAB_NAME a

или что-нибудь подобное.

Здесь ваша система поймет, что вы пытаетесь выбрать все из таблицы a, что означает, что вы можетевыберите любой другой столбец / функцию и т. д. из таблицы a или из любой другой таблицы.Это причина, по которой ваша система / база данных позволит вам вставлять другие столбцы col / func также после, если требуется, или вы можете использовать из условия from после a.*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...