Псевдонимы таблиц ?

DennisL
Дата: 16.03.2001 12:04:22
Вопрос следующй :

Каковы правлила использования псевдонимов таблиц я имею ввиду SELECT * FROM Customers c Where c.ID= ....
вопросы :
1. Какой диапазон видимости такого псевдонима ( в пределах одного запроса ? продцедуры ?)
2. Где можно объявлять ? только после FROM или еще как-то ?
3. Если сложный запрос с несколькими подзапросами то где надо объявлять и вообще какие здесь правила объявления таблиц, нехочеться их везде указывать ... пример
SELECT *,
(SELECT SUM(CostSum)
FROM dbo.LAddCosts c
WHERE c.LAgr_id = a.Lagr_id) AS AdditionalCosts,
(SELECT COUNT(*)
FROM dbo.LAgrDocs d
WHERE d.LAgr_id = a.Lagr_id AND d.DocEx = 0) AS AllDocumentsExists
FROM dbo.LAgreements a INNER JOIN с ON c.LAgr_id = a.Lagr_id

таблица с не видна при JOIN ....
SergSuper
Дата: 16.03.2001 12:23:16
table_alias
Is an alias for table_name, view_name, or rowset_function, used either for convenience or to distinguish a table or view in a self-join or subquery. An alias is often a shortened table name used to refer to specific columns of the tables in a join. If the same column name exists in more than one table in the join, SQL Server requires that the column name must be qualified by a table name or alias. (The table name cannot be used if an alias is defined).

Если почитать BOL, то становиться понятно, что

1.Видимость в пределах запроса
2.Объявляется только для вида, таблицы или rowset-функции, соответственно во FROMе после имени таблицы(вида, функции)
3.Объявлять их необязательно, используются для того чтобы отличать колонки с одинаковыми именами. В примере ошибка мз-за того что JOIN должен быть связан с конкретной таблицей, а не с алиасом. Алиас - только для имён колонок
Genady
Дата: 16.03.2001 12:29:35
>3.Объявлять их необязательно, используются для того чтобы отличать колонки с одинаковыми именами. В примере ошибка мз-за того >что JOIN должен быть связан с конкретной таблицей, а не с алиасом. Алиас - только для имён колонок

Неправда
В join-е можно алиасы использовать, а впримере не виден, потому что используется как раз не в пределах запроса
DennisL
Дата: 16.03.2001 12:31:42
Спасибо, вроде разобрался !!
SergSuper
Дата: 16.03.2001 13:04:59
2Genady

Ой, не знал что в join-е можно алиасы использовать. Из описания этого тоже не видно
[ FROM { < table_source > } [ ,...n ] ]

< table_source > ::=
table_name [ [ AS ] table_alias ] [ WITH ( < table_hint > [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ] [ WITH ( < view_hint > [ ,...n ] ) ]
| rowset_function [ [ AS ] table_alias ]
| user_defined_function [ [ AS ] table_alias ]
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| < joined_table >

< joined_table > ::=
< table_source > < join_type > < table_source > ON < search_condition >
| < table_source > CROSS JOIN < table_source >
| [ ( ] < joined_table > [ ) ]

< join_type > ::=
[ INNER | { { LEFT | RIGHT | FULL } [ OUTER] } ]
[ < join_hint > ]
JOIN

А можно пример как их написать? Я попытался изобразить что-то типа
select name, (select count(*) from syscolumns s
inner join o on o.id=s.id)
from sysobjects o
но это неправильно. А как надо было написать? Или вообще какой-нибудь работающий пример, т.к. в хелпе это не описано.

Заранее благодарен
Genady
Дата: 16.03.2001 13:36:32
select name, (select count(*) from syscolumns s
inner join sysobjects o on o.id=s.id)
from sysobjects

Вот так можно. В смысле что в выражении on можно писать
А Вы имели в виду, что сразу после join?
Если так, то я неправ
SergSuper
Дата: 16.03.2001 13:43:58
так то и я могу

У человека-то было написано:
a INNER JOIN с ON c.LAgr_id = a.Lagr_id
я про это написал и подумал что Вы с этим не согласны(типа так можно писать)

я даже и не обратил внимания что это другой запрос

вообщем, конценсус