Вопрос о присоединении к SQL - PullRequest
       114

Вопрос о присоединении к SQL

2 голосов
/ 29 ноября 2009

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

Или я попал в ловушку, используя select a._id, b._id .... z._id?

Ответы [ 9 ]

5 голосов
/ 29 ноября 2009

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

3 голосов
/ 29 ноября 2009

Конечно, для SQL Server вы должны указать его, чтобы запрос не был неоднозначным - я боюсь, что пойман в ловушку.

2 голосов
/ 30 ноября 2009

Это выглядит как кандидат на Natural Join например:

SELECT *
FROM   employee NATURAL JOIN department

Подробнее см. В этой статье " Основная операция запроса: объединение "

Цитата:

Ключевое слово NATURAL JOIN указывает что атрибуты, значения которых будут быть сопоставлены между двумя таблицами те с совпадающими именами; с очень за редким исключением, это будет атрибуты pk / fk, и они должны иметь совпадающие типы данных (и домены) а также.

Предупреждение. В зависимости от вашей РСУБД синтаксис Natural Join может поддерживаться или не поддерживаться. Вот некоторые, которые поддерживают это:

2 голосов
/ 29 ноября 2009

В некоторых РСУБД (например, Oracle) вы можете использовать форму JOIN ... USING .... Например:

select id, col1, col2 from table1 a join table2 b using (id)

составляет почти эквивалент:

select a.id, col1, col2 from table1 a join table2 b on a.id = b.id

Но:

  • JOIN ... USING ведет себя не так, как JOIN ... ON .... Самое главное, вы не можете использовать явный префикс со столбцом внутри с помощью ().

    В приведенном выше примере вы не можете использовать a.id или b.id. Так что это может быть сложнее, если у вас есть третья таблица с идентификатором столбца, который не связан к table1 и table2 id.

  • Во многих системах его нет (например, SQL Server), поэтому ваш код будет менее переносимым.

  • Многие люди (включая меня) предпочитают использовать явные псевдонимы таблиц со столбцами для наглядности и во избежание ошибок при редактировании запросов позже. Я просто использую короткие псевдонимы для таблиц и живу с ними.

1 голос
/ 29 ноября 2009

В стандартном SQL вам придется ставить префиксы для ваших столбцов.

Впрочем, другие диалекты SQL могут обеспечивать эту функциональность. Например, в Postgresql:

create table t1(id integer not null, t1 text not null);
create table t2(id integer not null, t2 text not null);

select id, t1, t2 from t1 join t2 using (id);

Здесь перед ID не обязательно ставить префикс, поскольку он используется в соединении.

0 голосов
/ 30 ноября 2009

Вы можете сэкономить немного времени при вводе в объединения, используя ON вместо записи имени столбца.

SELECT a._id, b._id FROM table1 a JOIN table2 b
ON _id
0 голосов
/ 30 ноября 2009

Важность псевдонима таблицы (проблеск от всего)

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

, например

select tableA.col1 , tableA.Col2,tableB.Col1,tableC.Col2 
from  tableA
join tableB 
on tableA.id = tableB.id
join tableC
on tableC.id = tableB.id
and tableC.id = tableA.id

Можно перефразировать как

select a.col1 , a.Col2,b.Col1,c.Col2 
from  tableA a
join tableB  b
on a.id = b.id
join tableC c
on c.id = b.id
and c.id = a.id

2) Устраняет неоднозначность имен столбцов

3) Улучшает восстанавливаемость кода

4) Предположим, у вас есть производная таблица типа

SELECT col1,col2
FROM (select *
      from mytable
      where col3 = 'somevalue') x

в этом случае псевдоним является обязательным

Примечание: -

Псевдоним столбца дает полное имя столбцу

например. select avg(col1) from mytable

, который дает вывод как

[No Column Name]
-----------------
30

можно украсить

select avg(col1) "Average" from mytable

или

select avg(col1) AS "Average" from mytable  

Выход:

Avegare
-------------
30

Однако ключевое слово AS является необязательным.

Надеюсь, это даст вам некоторое представление о том, почему мы должны использовать псевдоним таблицы

0 голосов
/ 29 ноября 2009

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

0 голосов
/ 29 ноября 2009

В общем, да, вы застряли, уточняя каждое дублированное имя столбца. Я предполагаю, что вы не хотите делать это, чтобы избежать дополнительной типизации; один из способов сделать это - использовать псевдонимы таблиц, например SELECT a.id, b.id FROM mylongtablename a, myotherlongtablename b ...

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

Короче говоря: справьтесь с дополнительным набором текста и добавьте префиксы к именам столбцов; это облегчит чтение и поддержку вашего запроса в будущем.

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