powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по оператору JOIN
4 сообщений из 29, страница 2 из 2
Вопрос по оператору JOIN
    #38265091
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слушайте, а поиск-то на сайте поломали, да?
Только через Google что-то получилось...
...
Рейтинг: 0 / 0
Вопрос по оператору JOIN
    #38265143
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Совершенно согласен, и повторюсь - понять структуру первого запроса легче, чем структуру второго, и для этого, сюрприз:)), не требуется разбирать структуру базы.Конечно же вы правы: (далее сарказм)
1. Когда смотрят структуру обычно судорожно ищут код ... код процедур (никто же типа вью не пишет) чтоб попытаться понять смысл.
2. Когда пишут систему, никогда не думают как она заработает и как будет работать при наработке данных, и как при предсказуемом расширении.
3. Каждый раз пишут запрос с нуля, и, сюрприз, запросы отличаются (в разных процедурах) и тогда начинаешь смотреть данные, спрашивать - а каков правильный смысл, FK-шек нет же на таблах.

Чесно, я бы с радостью хотел писать без LEFT , но:
1. оптимизатор запросов глуп как проблка не на столько гипер умный, чтобы понимать такие банальности всё.
2. Не всякую задачу можно к FK свести. И хоть JOIN и LEFT JOIN дают один результат, но не повесить ограничение, и получается что формально запросы разные (для скуля).

Поэтому давайте я уточню - LEFT я имел ввиду в большей части для VIEW (объектной части).
Cygapb-007А вопросы оптимизации времени выполнения могут возникнуть только при реально долгом времени выполнения запроса)Ага, пока в жо не стрельнёт даже не будем думать об оптимизации?
Правило разработчика: структура системы/базы пишется, сюрприз, под запросы/нужды, а не под топорную объектную модель.
Так что "как" оно будет работать, как ни парадоксально, нужно понимать ещё до того как опишешь "что".
Всё должно работать быстро для всех задач, нужно же управлять нагрузкой, её временем проявления.
Cygapb-007И еще раз повторюсь, в проекте был использован второй вариант, потому что не знал (не подумал?) об альтернативных вариантах:)Незнание в квадрате?
"Знай свой продукт. Иначе какой ты разработчик."

1-е правило "минимизации"
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
USE tempdb
GO
CREATE TABLE dbo.[Type]	(ID Int Identity PRIMARY KEY, Data VarChar(50))
CREATE TABLE dbo.Child	(ID Int Identity PRIMARY KEY, [Type] Int REFERENCES dbo.[Type] (ID), Data VarChar(50))
GO
CREATE VIEW dbo.VChildHard AS
SELECT	C.ID,C.[Type],T.Data AS TypeData,C.Data
FROM	     dbo.Child	C
	JOIN dbo.[Type]	T ON T.ID = C.[Type]
GO
SELECT ID FROM dbo.VChildHard
GO
CREATE VIEW dbo.VChildSoft AS
SELECT	C.ID,C.[Type],T.Data AS TypeData,C.Data
FROM	     dbo.Child	C
LEFT	JOIN dbo.[Type]	T ON T.ID = C.[Type]
GO
SELECT ID FROM dbo.VChildSoft
GO
DROP VIEW dbo.VChildSoft
DROP VIEW dbo.VChildHard
DROP TABLE dbo.Child
DROP TABLE dbo.[Type]

Смотрим планы.
Только не надо впендёривать везде LEFT. Это исключение для вью (объектной модели) или специальных запросах.
Как раз уже в самих запросах (в процедурах) как раз нормально (как положено), это может очень неплохо сказываться на оптимизации и плане. Ну это когда запросы специализированные (а не стандартное мясо).
Я предупредил.

PS: Надеюсь на тон мы не реагируем. Закалка. ;)
...
Рейтинг: 0 / 0
Вопрос по оператору JOIN
    #38265171
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VRafaelДа, но по какой-то причине его никто не используетНеправда. Я использую.
...
Рейтинг: 0 / 0
Вопрос по оператору JOIN
    #38265184
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VRafaelGloryЭто не разный синтаксис, это один и тот же документированный синтаксис
пример дает разные результаты на других данных
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
declare @t1 table (t1_id int primary key, name varchar(100));
declare @t2 table (t2_id int primary key, name varchar(100), t1_id int);
declare @t3 table (t3_id int primary key, t2_id int);

insert into @t1
values
 (1, 't1_a'), (2, 't1_b');

insert into @t2
values
 (1, 't2_a', 1), (2, 't2_b', 2),(3, 't2_c', 3);;

insert into @t3
values
 (1, 1), (2, null),(3, 3),(4,null);
 
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 @t2 t2 on t2.t2_id = t3.t2_id left join
 @t1 t1 on t1.t1_id = t2.t1_id;

/*Скобки использованы только для улучшения читаемости*/
select
 t3.t3_id, t2.name, t1.name
from
 @t3 t3 left join
 (
  @t2 t2 join
  @t1 t1 on t1.t1_id = t2.t1_id
 ) on t2.t2_id = t3.t2_id;


и не такое бывает, если менять join-ы
left join
@t1 t1
почему то превратился в
join
@t1 t1
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по оператору JOIN
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]