#sql #join #tags #ansi-sql
#sql #Присоединиться #Теги #ansi-sql
Вопрос:
Прежде чем он будет помечен как дубликат, я не спрашиваю, должен ли я указывать его полностью, я объясняю, почему не имеет значения, указан ли он. Надеюсь, это прояснит ситуацию. Теперь к вопросу.
Я новичок в SQL, поэтому я не уверен, есть ли какой-то технический термин для этого.
Допустим, у меня есть база данных с таблицами: Заказы и клиенты.
Заказы имеют категории: OrderID, CustomerID и OrderDate
У клиентов есть категории: CustomerID, CustomerName, ContactName и Country
Затем у меня есть SQL-запрос:
SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
Итак, я выбираю Orders.OrderID
, Customers.CustomerName
и Orders.OrderDate
FROM
Orders
таблицу. Если это из таблицы Orders, зачем указывать Orders.
перед OrderID
и OrderDate
в select ?Это пример с веб-сайта, и он не объясняет этого. Я не уверен, связано ли это с join (который приведен в примере), поэтому я также поместил его туда и в теги.
-Спасибо
Комментарии:
1. Вы указываете таблицу (напрямую или по ее псевдониму, я бы рекомендовал использовать псевдонимы практически постоянно), поэтому sql server знает, где найти столбец. Это не обязательно, если имя столбца уникально (например, если
OrderID
не существует вCustomers
). Даже если в этом нет необходимости, его всегда желательно использовать, чтобы вы (и люди, которым приходится поддерживать ваш код) могли также легко определить, какой столбец из какой таблицы взят. особенно когда вы начинаете объединять несколько таблиц.2. @HoneyBadger Значит, это требуется, если другие таблицы данных имеют такое же имя столбца? Пользовательское имя уникально и имеет дату заказа. Кроме того, если это «ИЗ заказов», то почему запрашиваются другие таблицы? Зачем вообще беспокоиться о From, если вы можете просто использовать оператор dot…
3. Вот как работает sql. Я не думаю, что есть большой смысл спрашивать, почему это работает таким образом.
4. Это точно так же, как
object.property
Если вы не укажете, из какой таблицы должен быть прочитан столбец, механизм SQL должен сделать вывод об этом, и если в обеих таблицах есть столбцы с одинаковыми именами, он не сможет определить, какой из них вы имеете в виду. Что еще хуже, когда коллега приходит читать ваш код, им приходится угадывать. Вам следует присоединиться к соревнованию по запутанному кодированию, если вы действительно хотите, чтобы ваш код было трудно читать.5. Да, в этом случае две таблицы можно переключать. Но не в том случае, если вам нужно внешнее соединение (левое или правое).
Ответ №1:
Иногда имя столбца встречается в обеих таблицах, и ваша СУБД выдает ошибку о том, что столбец неоднозначен. Обычно хорошей идеей является явное объявление, из какой таблицы вы хотите получить элемент.
Использование псевдонима часто облегчает чтение и запись кода:
SELECT ord.OrderID, cus.CustomerName, ord.OrderDate
FROM Orders ord
INNER JOIN Customers cus ON ord.CustomerID=cus.CustomerID;
Эти имена таблиц довольно короткие, но вы можете видеть, насколько полезными могут быть псевдонимы, когда имена таблиц становятся длиннее и сложнее.
Одним из преимуществ явного объявления таблицы является то, что вы можете сразу определить, из какой таблицы поступают данные. Если у вас есть данные, поступающие из многих источников, через объединения или нет, может быть трудно точно определить, из какой таблицы поступает поле, если вы не показываете таблицу в операторах select .
Комментарии:
1. Значит, слово перед точкой — это просто псевдоним? Я думал, вы используете AS для псевдонимов.
2. Да, вы можете видеть, что «ord» также следует за заказами в разделе FROM . Именно здесь вы сообщаете СУБД, что ord является псевдонимом для заказов. То же самое касается «cus», следующих за клиентами ВНУТРЕННЕГО объединения. Использование AS в этом случае необязательно.
3.@JustAFellowCoder —
AS ord
определяет псевдоним.ord.CustomerID
считывает столбецCustomerID
из таблицы, на которую ссылается псевдонимord
.4. @JustAFellowCoder — Прочитайте мой комментарий к вашему сообщению и прочитайте несколько руководств. Извините, но сейчас вы идете по пути
please teach me SQL's syntax
вместо того, чтобы задать конкретный вопрос.5. @MatBailie справедливый. Я пойду и сделаю это. На первоначальный вопрос был дан ответ, так что спасибо всем вам :). Удачного кодирования.