powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос
126 сообщений из 126, показаны все 6 страниц
Вложенный запрос
    #39572953
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помочь с вложенным запросом. Необходимо вывести клиентов и сумму их задолженности. Я это делаю так, но выдает ошибку "
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения."
Код: sql
1.
2.
3.
4.
SELECT c.PriceOfResidency-(SELECT Pay FROM Payment)AS "Debet", Surname
FROM Residency c, Payment b, Clients JOIN Residency ON Clients.ClientID=Residency.ClientID
					                JOIN Payment ON Residency.ResidencyID=Payment.ResidencyID
WHERE (c.PriceOfResidency!=b.Pay);
...
Рейтинг: 0 / 0
Вложенный запрос
    #39572959
xenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Rismen,
Код: sql
1.
(SELECT Pay FROM Payment)


может, тут SUM(Pay)
?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39572962
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
xenix, нет, тогда выводит около 675 строк, а должен 3
...
Рейтинг: 0 / 0
Вложенный запрос
    #39572965
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rismen,
авторогда выводит около 675 строк, а должен 3
допишите SELECT TOP 3 иначе не спасти.

FROM Residency c, Payment b, Clients и потом опять JOIN Residency JOIN Payment

на угад как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT Surname, SUM(c.PriceOfResidency)-SUM(Payment) AS [Debet]
FROM Residency c
INNER JOIN Clients
ON Clients.ClientID=c.ClientID
INNER JOIN Payment 
ON c.ResidencyID=Payment.ResidencyID
GROUP BY Surname
HAVING SUM(c.PriceOfResidency) <> SUM(b.Pay);
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573080
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaK,
всё равно не выводит, то что нужно. Могу скинуть саму базу данных https://drive.google.com/open?id=1TVcrxWEFqn7zERAubE7-3qoeV3eKyLwY
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573154
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKна угад как-то так

Как я понимаю, могут быть клиенты без единого платежа.
Тогда уж так:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT C.Surname, SUM(R.PriceOfResidency)-SUM(ISNULL(P.Payment,0)) AS Debt
FROM Clients C
JOIN Residency R ON C.ClientID=R.ClientID
LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
GROUP BY Surname
HAVING ABS(SUM(R.PriceOfResidency)-SUM(ISNULL(P.Payment)))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573352
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
WITH
R AS (
  SELECT
    [ClientID],
    [Sum] = SUM( [PriceOfResidency] )
  FROM
    Residency
  GROUP BY
    [ClientID]
),
P AS (
  SELECT
    [ClientID],
    [Sum] = SUM( [Payment] )
  FROM
    Payment
  GROUP BY
    [ClientID]
)
SELECT 
  C.[ClientID],
  C.[Surname], 
  [Debt] = ISNULL( P.[Sum], 0 ) - ISNULL( R.[Sum], 0 )
FROM 
  Clients C
  LEFT JOIN R ON (
        R.[ClientID] = C.[ClientID] )
  LEFT JOIN P ON (
        P.[ClientID] = C.[ClientID] )
WHERE
  ISNULL( R.[Sum], 0 ) > ISNULL( P.[Sum], 0 )
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573359
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамирович
Код: sql
1.
WITH


Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573361
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ноль пропустил. Исправлено.

Код: sql
1.
2.
3.
4.
5.
6.
SELECT C.Surname, SUM(R.PriceOfResidency)-SUM(ISNULL(P.Payment,0)) AS Debt
FROM Clients C
JOIN Residency R ON C.ClientID=R.ClientID
LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
GROUP BY Surname
HAVING ABS(SUM(R.PriceOfResidency)-SUM(ISNULL(P.Payment,0)))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573369
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
Такое ощущение, что ты из PL/SQL пришёл. или из будущего, где MS SQL научился WITH материализовывать.
ptr128Ноль пропустил. Исправлено.
2. Твой скрипт изначально некорректно считает, мелкими исправлениями ты его не улучшишь.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573451
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамировичptr128Для чего в этой задаче CTE?
MS SQL научился WITH материализовывать.[/quot]
Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb


Руслан Дамирович2. Твой скрипт изначально некорректно считает, мелкими исправлениями ты его не улучшишь.
А если не как в церкви, без догм? В чем претензии?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573458
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb
Шедевральное заблуждение.
ptr128А если не как в церкви, без догм?
Не получится, я верю только в чистый и понятный код.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573481
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан Дамировичptr128Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb
Шедевральное заблуждение.
Опять догма?
Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb. При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTP. Когда же объем данных большой, то уходим на диск.
Кстати, именно когда я обнаружил, что CTE - не более, чем "ситаксический сахар", но без возможности указания необходимых индексов для временных таблиц, я от него отказался. Уже на нескольких миллионах записей иерархии, глубиной всего в десяток уровней, разница в производительности стала заметна на глаз.

ptr128А если не как в церкви, без догм?
Не получится, я верю только в чистый и понятный код.[/quot]
Это чей код Вы называете "чистым"?
Откуда Вы вообще взяли, что в таблце Payment есть поле ClientID? У ТС таблица Payment связана только с Residency через ResidencyID.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573492
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ptr128
Объекты CTE[/quot]
Расскажи-ка нам подробнее, что за "объекты СТЕ".
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573500
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Суммы будут не верно считаться, для PriceOfResidency

Исправленная версия:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, R.PriceOfResidency, SUM(ISNULL(P.Payment,0) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573509
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileРасскажи-ка нам подробнее, что за "объекты СТЕ".
Почитайте
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573511
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

авторОбъекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb. При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTP. Когда же объем данных большой, то уходим на диск.
как же таких sql то терпит....
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573520
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128,

авторОбъекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb. При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTP. Когда же объем данных большой, то уходим на диск.
как же таких sql то терпит....
Самокритично
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573521
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb.Ждем ссылку на документацию. Или, хотя бы, репро.
ptr128При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTPА когда in-memory OLTP еще не было?
Опять же, ждем ссылку на документацию.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573527
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,
дарагуля и де там про жизнь в оперативке?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573529
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmА когда in-memory OLTP еще не было?
Опять же, ждем ссылку на документацию.
Когда не было - непосредственно в tempdb.
Ссылка выше.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573530
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128,
дарагуля и де там про жизнь в оперативке?
Деточка, а Вы не знали, что, пока достаточно оперативки, TempDB в ней и живет?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573533
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKptr128,
дарагуля и де там про жизнь в оперативке?
Деточка, а Вы не знали, что, пока достаточно оперативки, TempDB в ней и живет?
нет, а ms об этом знает? может даже пишут где?

ну и про это тоже
автортабличных переменных, вложенных запросов и т.п. размещаются в tempdb.
упоротые бараны больше всего веселят
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573542
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128CammomileРасскажи-ка нам подробнее, что за "объекты СТЕ".
Почитайте
Сам то справился ссылку свою прочитать?

авторA r e essentially disposable VIEWs
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573547
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573549
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Ссылка выше.С каких пор stackexchange стал документацией?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573551
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Деточка, а Вы не знали, что, пока достаточно оперативки, TempDB в ней и живет?
нет, а ms об этом знает? может даже пишут где?
Естественно , не то что Вы.
Цитирую:
If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).

TaPaKавтортабличных переменных, вложенных запросов и т.п. размещаются в tempdb.
упоротые бараны больше всего веселят
Опять самокритично
Цитирую:
tempdb use:

Table variables

Queries that contain SELECT, INSERT, UPDATE, and DELETE statements can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.

A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.
When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573554
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Ссылка выше.С каких пор stackexchange стал документацией?
Не вопрос. Выше дал ссылки на MS. Так устроит?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573556
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKпропущено...

нет, а ms об этом знает? может даже пишут где?
Естественно , не то что Вы.
Цитирую:
If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).

TaPaKпропущено...

упоротые бараны больше всего веселят
Опять самокритично
Цитирую:
tempdb use:

Table variables

Queries that contain SELECT, INSERT, UPDATE, and DELETE statements can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.

A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement.
When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
я так понимаю вы не можете перевести то что написано?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573558
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
А ты серьезно не видишь разницы между "Объект СТЕ живет в ТемпДб" и " Движок сервера может скидывать в таблицу результаты промежуточных вычислений" ?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573561
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фиг с ним, не осилил превеод это ладно, но где же там про
автор TempDB в ней и живет
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573563
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKя так понимаю вы не можете перевести то что написано?
Зачем??? В нашей сфере деятельности, человеку, не способному свободно читать технические английские тексты, делать вообще нечего.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573567
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗачем??? В нашей сфере деятельности, человеку, не способному свободно читать технические английские тексты, делать вообще нечего а он прикольный, можно ещё пару таких на пятницу заказать
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573569
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomileptr128
When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
А ты серьезно не видишь разницы между "Объект СТЕ живет в ТемпДб" и " Движок сервера может скидывать в таблицу результаты промежуточных вычислений" ?
"Движок сервера умеет скидывать в таблицу результаты промежуточных вычислений"
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573572
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKфиг с ним, не осилил превеод это ладно, но где же там про
автор TempDB в ней и живет
If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573574
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKавторЗачем??? В нашей сфере деятельности, человеку, не способному свободно читать технические английские тексты, делать вообще нечего а он прикольный, можно ещё пару таких на пятницу заказать
Интересно, тут есть вообще кто-то умеющий признавать свои ошибки? Или ЧСВ не позволяет?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573577
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKпропущено...
а он прикольный, можно ещё пару таких на пятницу заказать
Интересно, тут есть вообще кто-то умеющий признавать свои ошибки? Или ЧСВ не позволяет?
начинай

Код: sql
1.
2.
DECLARE @T TABLE (Id INT)
SELECT * FROM tempdb.sys.objects WHERE name LIKE '#%'
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573588
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Интересно, тут есть вообще кто-то умеющий признавать свои ошибки? Или ЧСВ не позволяет?
начинай

Код: sql
1.
2.
DECLARE @T TABLE (Id INT)
SELECT * FROM tempdb.sys.objects WHERE name LIKE '#%'



Что начинать?

Код: sql
1.
2.
3.
4.
DECLARE @T TABLE (Id INT)
SELECT user_objects_alloc_page_count FROM sys.dm_db_task_space_usage WHERE session_id=@@SPID
INSERT @T VALUES (1),(2),(3),(4),(5),(6),(7)
SELECT user_objects_alloc_page_count FROM sys.dm_db_task_space_usage WHERE session_id=@@SPID



На всякий случай
sys.dm_db_task_space_usage [...] This view is applicable only to the tempdb database.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573589
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

т.е. ты теперь доказываешь что всё в темпд и всё на диске? ну ладно, таких прикольных больше одного не надо
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573593
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128,

т.е. ты теперь доказываешь что всё в темпд и всё на диске? ну ладно, таких прикольных больше одного не надо

Вы тупой или притворяетесь?

ptr128If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573598
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Cammomileпропущено...

А ты серьезно не видишь разницы между "Объект СТЕ живет в ТемпДб" и " Движок сервера может скидывать в таблицу результаты промежуточных вычислений" ?
"Движок сервера умеет скидывать в таблицу результаты промежуточных вычислений"Жесть.

Тут всем известно, что операторы движка сиквела могут использовать tempdb

Например, при выполнении запроса:
Код: sql
1.
2.
3.
select *
from table
order by field


движок сиквела может использовать tempdb для сортировки.

Но говорить из за этого, по вашей логике, что "объекты простых запросов хранятся в tempdb" так же абсурдно, как ваше "Объекты CTE, ..., вложенных запросов и т.п. размещаются в tempdb".

"Объектов CTE и вложенных запросов" просто не существует как явления, так же как не существует "объекта простого select", так что и хранить их невозможно в принципе.
ptr128Интересно, тут есть вообще кто-то умеющий признавать свои ошибки? Или ЧСВ не позволяет?Один из обсуждающих не умеет точно, а уж ЧСВ у него
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573601
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKptr128,

т.е. ты теперь доказываешь что всё в темпд и всё на диске? ну ладно, таких прикольных больше одного не надо

Вы тупой или притворяетесь?

ptr128If memory is available, both table variables and temporary tables are created and processed while in memory (data cache).
тупой, рассказывайте: вы показали что меняется размер базы tempdb прям на диске, но при этом всё в памяти, я в отчаянии
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573603
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

*stack*.* и т.п. здесь авторитетным источником не считается.
Для начала изучите, что же хранится в tempdb - https://docs.microsoft.com/en-us/sql/relational-databases/databases/tempdb-database
Затем почитайте что такое Buffer Pool и чем tempdb в этом плане отличается от других БД.

На закуску - https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-memory-optimization
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573605
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg"Объектов CTE и вложенных запросов" просто не существует как явления
Смысл придираться к словам?
По смыслу и так ясно, что речь идет об "объектах создаваемых CTE" и "объектов создаваемых вложенными запросами"
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573610
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128,

*stack*.* и т.п. здесь авторитетным источником не считается.

Я уже понял и поэтому дал ссылку на MS.

invmДля начала изучите, что же хранится в tempdb
Вот именно почитайте
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573616
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,
автор
Вот именно почитайте
тут есть уже один который даёт ссылки не читая, второго не надо.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573619
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128alexeyvg"Объектов CTE и вложенных запросов" просто не существует как явления
Смысл придираться к словам?
По смыслу и так ясно, что речь идет об "объектах создаваемых CTE" и "объектов создаваемых вложенными запросами"
О, а вот и режим "зачем объяснять итак понятно"
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573623
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomileptr128пропущено...

Смысл придираться к словам?
По смыслу и так ясно, что речь идет об "объектах создаваемых CTE" и "объектов создаваемых вложенными запросами"
О, а вот и режим "зачем объяснять итак понятно"
Извините, я не учел, что здесь не все владеют русским и в фразе "Объекты строительства" считают само строительство объектом.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573639
Goga-Gola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128invmptr128,

*stack*.* и т.п. здесь авторитетным источником не считается.

Я уже понял и поэтому дал ссылку на MS.

invmДля начала изучите, что же хранится в tempdb
Вот именно почитайте


https://technet.microsoft.com/ru-ru/library/ms345368(v=sql.105).aspx - тут на Русском :)

...Обобщенные табличные выражения могут рассматриваться как временные результирующие наборы, определенные в области выполнения одиночных инструкций SELECT, INSERT, UPDATE, DELETE и CREATE VIEW.

Когда в плане запроса для обобщенного табличного выражения для сохранения промежуточных результатов используется оператор буферизации, ядро СУБД создает рабочую таблицу в базе данных tempdb для поддержки этой операции.....
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573646
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руслан Дамирович,
ваш запрос не работает так как нужно. В бд в таблице Payment строка 7 в столбце Pay оплата указана не полная, 8 и 9 строка не оплачены. Если посмотреть в таблицу Residency, то в столбце PriceOfResidency указана полная стоимость. И нам нужен запрос, который бы вычислял эту разницу и выводил.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573649
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-Gola тут на Русском :)

У MS, часто, очень не качественный перевод. Во многих местах даже машинный. И временами он исказажает смысл до противоположного. Поэтому стараюсь все читать все же в оригинале, по-английски. Чего и Вам желаю )
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573655
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rismenваш запрос не работает так как нужно
Попробуйте мой последний вариант запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, R.PriceOfResidency, SUM(ISNULL(P.Payment,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573674
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128Rismenваш запрос не работает так как нужно
Попробуйте мой последний вариант запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, R.PriceOfResidency, SUM(ISNULL(P.Payment,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005



Выдает ошибку: Столбец "Residency.PriceOfResidency" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573677
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RismenВыдает ошибку

Логично с его стороны )
Исправил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, MAX(R.PriceOfResidency) AS PriceOfResidency, SUM(ISNULL(P.Payment,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573685
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Вот именно почитайте Ну и где там подтверждение вашего изречения "Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb"?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573695
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128Вот именно почитайте Ну и где там подтверждение вашего изречения "Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb"?
О господи! Откройте ссылку и внимательно изучите содержимое таблицы после фразы "The following table lists the features in SQL Server that create user objects, internal objects, or row versions in tempdb."
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573702
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128invmпропущено...
Ну и где там подтверждение вашего изречения "Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb"?
О господи! Откройте ссылку и внимательно изучите содержимое таблицы после фразы "The following table lists the features in SQL Server that create user objects, internal objects, or row versions in tempdb."
дарагуля, ты наверное хотел сказать изначально что ингода попадают в tempdb? только когда spool есть? А мы тут в ужасе что всегда cte/вложенные запросы в tepmdb падают
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573706
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKдарагуля, ты наверное хотел сказать изначально что ингода попадают в tempdb?
Нет, детка, нет. Читайте внимательно. И цитируйте оттуда, если желаете возразить.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573708
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKдарагуля, ты наверное хотел сказать изначально что ингода попадают в tempdb?
Нет, детка, нет. Читайте внимательно. И цитируйте оттуда, если желаете возразить.
милочка, позвольте
авторWhen the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573741
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Нет, детка, нет. Читайте внимательно. И цитируйте оттуда, если желаете возразить.
милочка, позвольте
авторWhen the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation.
Да, в этом случае tempdb используется еще и для этого. Кроме того, что написано было в этой же ячейке перед приведенной Вами фразой:
"A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement."
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573747
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKпропущено...

милочка, позвольте
пропущено...

Да, в этом случае tempdb используется еще и для этого. Кроме того, что написано было в этой же ячейке перед приведенной Вами фразой:
"A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement."
а как вы понимаете приведённую вам фразу?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573764
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Да, в этом случае tempdb используется еще и для этого. Кроме того, что написано было в этой же ячейке перед приведенной Вами фразой:
"A common table expression can be thought of as a temporary result set that is defined within the execution scope of a single SELECT, INSERT, UPDATE, DELETE, or CREATE VIEW statement."
а как вы понимаете приведённую вам фразу?
Была же выше ссылка. В лом открыть?
"Обобщенные табличные выражения могут рассматриваться как временные результирующие наборы, определенные в области выполнения одиночных инструкций SELECT, INSERT, UPDATE, DELETE и CREATE VIEW. "
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573767
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKпропущено...

а как вы понимаете приведённую вам фразу?
Была же выше ссылка. В лом открыть?
"Обобщенные табличные выражения могут рассматриваться как временные результирующие наборы, определенные в области выполнения одиночных инструкций SELECT, INSERT, UPDATE, DELETE и CREATE VIEW. "
и это означает что cte в tempdb всегда?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573788
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128О господи!Вот именно! Но и "рукалицо" тоже подойдет.
Медитируйте над фразой "When the query plan for a common table expression query uses a spool operator to save intermediate query results, the Database Engine creates a work table in tempdb to support this operation." пока полностью не поймете смысл.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573796
Goga-Gola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К чему этот спор? Кто-то надеется, что собеседник скажет - ну да, я был не прав?
Гордыня так и прет. И невежество тоже...

Остановитесь! /(С) Янукович/ :)
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573798
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128пропущено...

Была же выше ссылка. В лом открыть?
"Обобщенные табличные выражения могут рассматриваться как временные результирующие наборы, определенные в области выполнения одиночных инструкций SELECT, INSERT, UPDATE, DELETE и CREATE VIEW. "
и это означает что cte в tempdb всегда?
Ну раз эта фраза находится в колонке "tempdb use"...

На самом деле, в частных случаях, когда план запроса не подразумевает хранения промежуточных результатов, могу предполагать, что объект для результирующих наборов данных CTE в tempdb остается пустым. Оптимизатор все же не настолько туп. Но достаточно только уйти в рекурсию, агрегацию или JOIN не во вложенном цикле, а через хеш, как данные туда посыпятся.
К сожалению, информации о внутреннем устройстве MS SQL очень мало. Как я уже писал выше, от CTE я отказался, когда обнаружил, что он демонстрирует худшую производительность, по сравнению с явным использованием временных таблиц с разумно созданными индексами. А в тех случаях, когда можно обойтись без временных таблиц, он не очень то и нужен, так как легко заменяется вложенными запросами или вьюхами.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573803
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-GolaКто-то надеется, что собеседник скажет - ну да, я был не прав?

Мне приходится говорить эту фразу регулярно. Даже на этом форуме я уже несколько раз признавал свою ошибку только за эту неделю. Как может быть всегда прав человек, который что-то делает?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573813
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

ptr128,

авторНу раз эта фраза находится в колонке "tempdb use"... агонь!


Код: sql
1.
На самом деле, в частных случаях, когда план запроса не подразумевает хранения промежуточных результатов, могу предполагать, что объект для результирующих наборов данных CTE в tempdb остается пустым. Оптимизатор все же не настолько туп. Но достаточно только уйти в рекурсию, агрегацию или JOIN не во вложенном цикле, а через хеш, как данные туда посыпятся.


т.е.

Код: sql
1.
;WITH C(I) AS (SELECT TOP 1 number FROM master..spt_Values ),X AS (SELECT a.I FROM C a INNER HASH JOIN C b ON a.I = b.I) SELECT * FROM x


полезет в tempdb?

авторА в тех случаях, когда можно обойтись без временных таблиц, он не очень то и нужен, так как легко заменяется вложенными запросами или вьюхами. cte заменяется вложенными запросами.... я не ем сахар, я заменяю его сахаром
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573824
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128RismenВыдает ошибку

Исправил


Теперь уже работает, но выдает не тех клиентов, которые нужны. Нужны последние три
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573827
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rismenptr128пропущено...


Исправил


Теперь уже работает, но выдает не тех клиентов, которые нужны. Нужны последние три

По какому признаку последние?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573859
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKполезет в tempdb?

Проверяйте сами. Вы уже потеряли в моих глазах всякое уважение. Поэтому не дождетесь, чтобы я ради Вас хоть пальцем пошевелил.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573880
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128К сожалению, информации о внутреннем устройстве MS SQL очень мало.Информации полно. Видимо, вы просто не умеете искать.
А если бы нашли и почитали, то не писали бы бред типаptr128На самом деле, в частных случаях, когда план запроса не подразумевает хранения промежуточных результатов, могу предполагать, что объект для результирующих наборов данных CTE в tempdb остается пустым.
К вседению - statistics io покажет все объекты, включая Worktable/Workfile. У неиспользуемых будет 0 чтений.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573887
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128Rismenпропущено...


Теперь уже работает, но выдает не тех клиентов, которые нужны. Нужны последние три

По какому признаку последние?

Если открыть бд, то в таблице Residency столбце PriceOfResidency полная стоимость за проживание. В таблице Payment столбце Pay сколько оплачено. И нужно вывести тех клиентов, которые либо не заплатили, либо оплатили частично.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573890
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmК вседению - statistics io покажет все объекты, включая Worktable/Workfile. У неиспользуемых будет 0 чтений.
Спасибо! Этого я не знал. Воспользуюсь в будущем )
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573899
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rismenptr128пропущено...


По какому признаку последние?

Если открыть бд, то в таблице Residency столбце PriceOfResidency полная стоимость за проживание. В таблице Payment столбце Pay сколько оплачено. И нужно вывести тех клиентов, которые либо не заплатили, либо оплатили частично.
Я вижу, что клиенты 1,2,3 полностью оплатили.
В запросе я, так как писал его без БД, неправильно указал имя поля. Вместо SUM(ISNULL(P.Payment,0)) должно быть SUM(ISNULL(P.Pay,0))
И запрос честно выдает оставшихся двух клиентов.

Еще раз запрос, с исправленным именем поля:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, MAX(R.PriceOfResidency) AS PriceOfResidency, SUM(ISNULL(P.Pay,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573902
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
SET STATISTICS IO ON 
;WITH CTE AS 
(SELECT * FROM sys.internal_tables) 
SELECT * FROM CTE 


авторTable 'syssingleobjrefs'. Scan count 32, logical reads 96, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syspalvalues'. Scan count 0, logical reads 32, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'syspalnames'. Scan count 0, logical reads 32, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'sysschobjs'. Scan count 1, logical reads 43, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Что-то я не вижу попыток заехать в тембдб. СТЕ есть, а "Объекта СТЕ" в тембдебе нету, миииистикааааа.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573952
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileЧто-то я не вижу попыток заехать в тембдб. СТЕ есть, а "Объекта СТЕ" в тембдебе нету, миииистикааааа.
Бы ли бы Вы хоть на йоту образованней, то использовали CTE в таком запросе, где его использование оправдано, а не пытались придумать настолько тупой запрос, который оптимизатор спокойно развернул без CTE.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573957
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого, сначала у него " итак понятно что объект не объект , а данные для запроса".

Теперь у него " итак понятно, что СТЕ не СТЕ".

С таким балаболом мастером пера сложно вести предметный разговор...
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573961
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileС таким балаболом мастером пера сложно вести предметный разговор...
Самокритично Вы про себя )
Насколько Тапок есть флудер и дитя бескультурное, но даже он написал с CTE запрос, создающий и Worktable И Workfile )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573964
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128CammomileС таким балаболом мастером пера сложно вести предметный разговор...
Самокритично Вы про себя )
Насколько Тапок есть флудер и дитя бескультурное, но даже он написал с CTE запрос, создающий и Worktable И Workfile )))
рыбка, тебе же уже сказали про 0 или уже забыла?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39573974
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKрыбка, тебе же уже сказали про 0 или уже забыла?
А Вам сказали, что если на автомобиле не ездить, то для него и топливо не нужно?
Или про то, что если его толкать или тянуть буксиром, то можно ездить без топлива?
Следует ли из этого, что автомобиль не использует топливо? )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574002
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128который оптимизатор спокойно развернул без CTE.А можете привести пример запроса, который оптимизатор не "разворачивает без CTE". Или, хотя бы, какой-нибудь признак в плане выполнения по которому можно понять, что CTE не "развернут".
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574010
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128который оптимизатор спокойно развернул без CTE.А можете привести пример запроса, который оптимизатор не "разворачивает без CTE". Или, хотя бы, какой-нибудь признак в плане выполнения по которому можно понять, что CTE не "развернут".
Так я же писал:
ptr128Насколько Тапок есть флудер и дитя бескультурное, но даже он написал с CTE запрос, создающий и Worktable И Workfile )))


Вот его запрос:
TaPaK
Код: sql
1.
;WITH C(I) AS (SELECT TOP 1 number FROM master..spt_Values ),X AS (SELECT a.I FROM C a INNER HASH JOIN C b ON a.I = b.I) SELECT * FROM x



И он честно выдает:
Код: sql
1.
2.
3.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'spt_values'. Scan count 2, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


Workfile и Worktable в tempdb созданы. Но из-за простоты запроса не понадобились.

Если же использовать CTE "по назначению", то есть для рекурсивного запроса, взяв образец, например, из
документации :

Код: 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.
33.
34.
35.
36.
-- Create an Employee table.  
CREATE TABLE dbo.MyEmployees  
(  
EmployeeID smallint NOT NULL,  
FirstName nvarchar(30)  NOT NULL,  
LastName  nvarchar(40) NOT NULL,  
Title nvarchar(50) NOT NULL,  
DeptID smallint NOT NULL,  
ManagerID int NULL,  
 CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)   
);  
-- Populate the table with values.  
INSERT INTO dbo.MyEmployees VALUES   
 (1, N'Ken', N'S&#225;nchez', N'Chief Executive Officer',16,NULL)  
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)  
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)  
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)  
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)  
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)  
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)  
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)  
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);  
WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS   
(  
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel  
    FROM dbo.MyEmployees   
    WHERE ManagerID IS NULL  
    UNION ALL  
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1  
    FROM dbo.MyEmployees AS e  
        INNER JOIN DirectReports AS d  
        ON e.ManagerID = d.EmployeeID   
)  
SELECT ManagerID, EmployeeID, Title, EmployeeLevel   
FROM DirectReports  
ORDER BY ManagerID;  



То увидим уже активную работу с Worktable в tempdb:

Код: sql
1.
2.
Table 'Worktable'. Scan count 2, logical reads 55, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'MyEmployees'. Scan count 2, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574041
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

Так что есть признак "неразворачиваемости"?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574046
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmptr128,

Так что есть признак "неразворачиваемости"?
Вам надо, Вы и исследуйте. Мне уже эта тема изрядно поднадоела. Если дети хотят использовать где ни попадя CTE - пусть используют. Тех, которые прийдут ко мне, сам переучу, продемонстрировав его ущербность на больших объемах данных. А остальные пусть работают на конкурентов )
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574072
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Вам надо, Вы и исследуйте.Т.е. вы таки почти четыре страницы заливали о том, о чем сами ничего не знаете.ptr128Мне уже эта тема изрядно поднадоелаСамо собой. Так обычно случается, когда нечего ответить на вопросы и аргументы оппонентов.ptr128Тех, которые прийдут ко мне, сам переучу, продемонстрировав его ущербность на больших объемах данных.Только не берите тех, которые смогут раскусить вашу собственную ущербность в данном вопросе. Или въедливых, которые будут доставать вопросом "а почему?". Иначе изрядно поднадоест переучивать.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574082
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128alexeyvg"Объектов CTE и вложенных запросов" просто не существует как явления
Смысл придираться к словам?
По смыслу и так ясно, что речь идет об "объектах создаваемых CTE" и "объектов создаваемых вложенными запросами"Придираюсь? Тут все именно так трактуют ваши слова.

Ещё раз спрошу: я не понимаю, почему в фразе "Объекты CTE, ..., вложенных запросов и т.п. размещаются в tempdb" вами не упомянуты обычные запросы из одной таблицы, даже без группировок?
Фраза была бы вполне закончена: "Объекты CTE, всех запросов и т.п. размещаются в tempdb"
И она бы по крайней мере хоть немножко бы соответствовала действительности, пусть с корявой формулировкой.

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

CTE и вложенные запросы не отличаются от оператора join.

Для сервера нету никаких особых "CTE" и "вложенных запросов", нет операторов database engine для них, есть просто синтаксис "SQL", его семантика после синтаксического анализа преобразуется в операторы обработки множеств, потом оптимизатор из этого делает исполняемые операторы для database engine, он выполняет эти операторы, и если памяти маловато, то он использует для промежуточного хранения tempdb.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574084
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmТак обычно случается, когда нечего ответить на вопросы и аргументы оппонентов.
Я не вижу вопросов и аргументов от Вас по интересующей меня теме. В упор.

Вы очень захотели знать, по какому признаку можно узнать, использована будет tempdb при CTE запросе или нет.

Каким образом это относится к моему утверждению мне совершенно не понятно.
"Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb."
Я нигде не писал, что "всегда размещаются", или "обязательно размещаются". Я просто привел ссылки на MS, доказывающие мое утверждение.
Мне совершенно не интересны частные случаи когда CTE не используют tempdb, из-за того, что такие случаи имеют нулевую практическую ценность.
Вашу просьбу "А можете привести пример запроса, который оптимизатор не "разворачивает без CTE"." я удовлетворил. И что происходит даже на примитивном рекурсивном запросе с CTE - я Вам продемонстрировал.
Вы и так уже признались, что были не в курсе того, что tempdb использует оперативную память, пока ее достаточно и то, что не знали, что CTE, табличные переменные и вложенные запросы размещают создаваемые ими внутренние объекты в tempdb. (Я перефразировал фразу "Объекты CTE, табличных переменных, вложенных запросов...", так как Вы признались, что у Вас проблемы с русским языком и Вы искренне считаете CTE, переменные и запросы внутренними объектами SQL)

Короче, или по теме, или общайтесь сами с собой.
Я Вам ничего не обязан. И обучать того, кто учиться не желает тоже не собираюсь.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574097
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Если же использовать CTE "по назначению", то есть для рекурсивного запроса, взяв образец, например, изБоже, ну там же прямое указание использовать tempdb
Выполните то же самое без CTE:
Код: sql
1.
2.
3.
4.
SELECT TOP 1 a.number 
    FROM master..spt_Values a 
        INNER HASH JOIN master..spt_Values b 
        ON a.number = b.number


HASH - вот волшебное слово, а не CTE
Уберите слово HASH из вашего запроса с CTE - и будет без worktable
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574098
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot alexeyvg]ptr128пропущено...

Смысл придираться к словам?
По смыслу и так ясно, что речь идет об "объектах создаваемых CTE" и "объектов создаваемых вложенными запросами"Придираюсь? Тут все именно так трактуют ваши слова.

Я уже извинился:
ptr128Извините, я не учел, что здесь не все владеют русским и в фразе "Объекты строительства" считают само строительство объектом.


alexeyvgЕщё раз спрошу: я не понимаю, почему в фразе "Объекты CTE, ..., вложенных запросов и т.п. размещаются в tempdb" вами не упомянуты обычные запросы из одной таблицы, даже без группировок?

Во-первых, приведите доказательство того, что "обычный запрос из одной таблицы [...] без группировок" размещает внутренний объект в tempdb. И без сортировки, пожалуйста )
Во-вторых, там еще очень много что не упомянуто: курсоры, почта, события, индексы, версионирование строк, триггеры и т.п.
Совершенно не вижу смысла перечислять все. Речь была вообще то исключительно о том, что CTE создает объекты в tempdb. Остальное просто к слову пришлось )

alexeyvgФраза была бы вполне закончена: "Объекты CTE, всех запросов и т.п. размещаются в tempdb"

Ну а как же курсоры, индексы и версионирования строк? )))
Еще раз, речь шла именно о CTE. Кстати, что интересно, вложенные запросы только Вас возбудили. Хотите извинюсь? Они ведь тоже не всегда порождают что-то в tempdb. Но уж если создают объект - размещают его именно там. )))

alexeyvgВложенные запросы, и их разновидность "CTE", не отличаются в этом смысле от каких либо других запросов.
CTE и вложенные запросы не отличаются от оператора join.

Увы, и те, и другие, различаются, причем очень существенно. А именно тем, что не предоставляют возможность создать по результату их выполнения необходимых индексов.

alexeyvgон выполняет эти операторы, и если памяти маловато, то он использует для промежуточного хранения tempdb.
Наоборот, я уже приводил цитату и ссылку: "If memory is available, both table variables and temporary tables are created and processed while in memory (data cache)."
Но даже это не так уж важно. Для меня важно то, что для временных таблиц я легко могу создать необходимые мне индексы, а для CTE, табличных переменных и подзапросов - нет. И именно поэтому на больших объемах данных эти механизмы проигрывают в производительности старым добрым временным таблицам. Которые, к тому же, можно размещать, при большом желании, in-memory.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574099
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgБоже, ну там же прямое указание использовать tempdb
Уберите слово HASH из вашего запроса с CTE - и будет без worktable
Это не мой запрос. И вы пропустили развитие тему. Там как раз явно было сказано, что HASH JOIN точно создаст объект в tempdb. )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574104
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128alexeyvgБоже, ну там же прямое указание использовать tempdb
Уберите слово HASH из вашего запроса с CTE - и будет без worktable
Это не мой запрос. И вы пропустили развитие тему. Там как раз явно было сказано, что HASH JOIN точно создаст объект в tempdb. )))Ваш - я имел в виду тот запрос, который вы привели.

Может, я что то пропустил, я просто смотрю на эти фразы:
ptr128Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdbиptr128Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb.
и конкретный пример с статистикой и HASH.

И сравниваем с цитируемой фразой:
ptr128can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.
В которой тоже не говорится, что CTE и вложенные запросы - объекты, хранимые в tempdb, а всего лишь то, что выполнение этого может потребовать использовать tempdb

Согласитесь уже, что реальность, а так же цитируемые источники имеют совершенно противоположный смысл вашим утверждениям.

Ещё раз, сравните:
- " Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb"
и
- " некоторые операторы database engine, например, hash joins, hash aggregates, или sorting, могут использовать tempdb"

Тут собрались люди, достаточно хорошо знающие сиквел, почитывающие блоги писателей ядра сиквела, и даже заходят те, кто сами пишет об этом книги, и им режет взгляд такая вольная интерпретация.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574105
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Вы очень захотели знать, по какому признаку можно узнать, использована будет tempdb при CTE запросе или нет.Читайте внимательно вопрос и не пытайтесь уйти в сторону - меня интересует признак "нераскрываемости" CTE. Т.е., признак того, что результат CTE где-то материализуется.
ptr128Каким образом это относится к моему утверждению мне совершенно не понятно.
"Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb."Из всего перечисленного к объектам относятся только табличные переменные. Остальное - ваши фантазии.ptr128Я нигде не писал, что "всегда размещаются", или "обязательно размещаются".Серьезно? А тут - 21051012 , 21051358 ?ptr128Мне совершенно не интересны частные случаи когда CTE не используют tempdb, из-за того, что такие случаи имеют нулевую практическую ценность.Не расписывайтесь за всех.
ptr128Вашу просьбу "А можете привести пример запроса, который оптимизатор не "разворачивает без CTE"." я удовлетворил.Где? Пока только словоблудие и попытки уйти от ответов на конкретные вопросы.ptr128Вы и так уже признались, что были не в курсе того, что tempdb использует оперативную память, пока ее достаточно и то, что не знали, что CTE, табличные переменные и вложенные запросы размещают создаваемые ими внутренние объекты в tempdb. (Я перефразировал фразу "Объекты CTE, табличных переменных, вложенных запросов...", так как Вы признались, что у Вас проблемы с русским языком и Вы искренне считаете CTE, переменные и запросы внутренними объектами SQL)Да-да. И это мы еще не перешли к вопросу про житиё tempdb в in-memory OLTP. Там моя вопиющая безграмотность проявится еще ярче...
И особенно интересно узнать, где свои "внутренние объекты" размещают "невложенные" запросы? Наверное в секретном месте...ptr128Короче, или по теме, или общайтесь сами с собой.Клиент слился... Почему-то неудивительно.ptr128И обучать того, кто учиться не желает тоже не собираюсь.Прежде чем кого-то обучать, неплохо самому изучить предмет преподавания. А вы даже общепринятой терминологией не владеете. Так что обучателем премудростям CTE вам не стать, увы.

ЗЫ: Не пытайтесь сохранить лицо, неся полнейший бред. Эффект ровно противоположный - выглядете еще большим идиотом.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574117
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmменя интересует [...] признак того, что результат CTE где-то материализуется.
Ну и интересуйтесь. Я тут при чем? Мне достаточно того, что объект, создаваемый CTE "материализуется" в иерархическом запросе, что я, кстати, доказал.
Код: sql
1.
2.
Table 'Worktable'. Scan count 2, logical reads 55, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'MyEmployees'. Scan count 2, logical reads 21, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.



invmptr128"Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb."
Из всего перечисленного к объектам относятся только табличные переменные.

Я в шоке! То есть Вы и вправду относитесь к тем, кто
ptr128"в фразе "Объекты строительства" считают само строительство объектом."

invmptr128Я нигде не писал, что "всегда размещаются", или "обязательно размещаются".Серьезно? А тут - 21051012 , 21051358 ?
У Вас галлюцинации? Найдите там слова "всегда" или "обязательно". Можно с трех попыток )))

invmptr128Мне совершенно не интересны частные случаи когда CTE не используют tempdb, из-за того, что такие случаи имеют нулевую практическую ценность.Не расписывайтесь за всех.

Выделите, пожалуста, в моей фразе слово "всех" )))

invmptr128Вашу просьбу "А можете привести пример запроса, который оптимизатор не "разворачивает без CTE"." я удовлетворил.Где?

Глаза протрите! Второй запрос в посте 21053346 после фразы "Если же использовать CTE "по назначению"..."

invmПока только словоблудие

Вот уж точно вы про себя )))
invmи попытки уйти от ответов на конкретные вопросы.

Извините, но если среди Вашего "словоблудия" и был конкретный вопрос, то я его пропустил. Пожалуйста, повторите его. Если он будт по теме - я на него отвечу. Но именно вопрос, а не просьба провести какие-то эксперименты или обучить Вас различать CTE запросы, создающие временные объекты в tempdb, от тех, которые такие запросы не создают.

invmк вопросу про житиё tempdb в in-memory OLTP.

Вот тут я соглашусь что погорячился и был не прав. MS под словосочетанием "in-memory OLTP" сейчас понимает совершенно отдельную компоненту внутри SQL сервера, несмотря на то, что ранее средства кеширования в памяти tempdb он тем же самым словосочетанием называл.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574121
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgptr128Это не мой запрос.)))Ваш - я имел в виду тот запрос, который вы привели.

Выделите, пожалуйста, в нем слово HASH:
Код: 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.
33.
34.
35.
36.
-- Create an Employee table.  
CREATE TABLE dbo.MyEmployees  
(  
EmployeeID smallint NOT NULL,  
FirstName nvarchar(30)  NOT NULL,  
LastName  nvarchar(40) NOT NULL,  
Title nvarchar(50) NOT NULL,  
DeptID smallint NOT NULL,  
ManagerID int NULL,  
 CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)   
);  
-- Populate the table with values.  
INSERT INTO dbo.MyEmployees VALUES   
 (1, N'Ken', N'S&#225;nchez', N'Chief Executive Officer',16,NULL)  
,(273, N'Brian', N'Welcker', N'Vice President of Sales',3,1)  
,(274, N'Stephen', N'Jiang', N'North American Sales Manager',3,273)  
,(275, N'Michael', N'Blythe', N'Sales Representative',3,274)  
,(276, N'Linda', N'Mitchell', N'Sales Representative',3,274)  
,(285, N'Syed', N'Abbas', N'Pacific Sales Manager',3,273)  
,(286, N'Lynn', N'Tsoflias', N'Sales Representative',3,285)  
,(16,  N'David',N'Bradley', N'Marketing Manager', 4, 273)  
,(23,  N'Mary', N'Gibson', N'Marketing Specialist', 4, 16);  
WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS   
(  
    SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel  
    FROM dbo.MyEmployees   
    WHERE ManagerID IS NULL  
    UNION ALL  
    SELECT e.ManagerID, e.EmployeeID, e.Title, EmployeeLevel + 1  
    FROM dbo.MyEmployees AS e  
        INNER JOIN DirectReports AS d  
        ON e.ManagerID = d.EmployeeID   
)  
SELECT ManagerID, EmployeeID, Title, EmployeeLevel   
FROM DirectReports  
ORDER BY ManagerID;  



alexeyvgМожет, я что то пропустил, я просто смотрю на эти фразы:
ptr128Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdbиptr128Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb.

Явно пропустили. Где тут сказано, что всегда или обязательно ? Да, внутренние объекты SQL сервера, создаваемые при использовании CTE "размещал" и "размещаются" в tempdb. Если CTE, вложенные запросы и т.п. объектов не создают, то и размещать нечего. Или Вы опять будете требовать от меня извинений за то, что считаете "строительство" объектом? Ну пожалуйтта, ну проститете! )))

alexeyvgptr128can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.
В которой тоже не говорится, что CTE и вложенные запросы - объекты, хранимые в tempdb, а всего лишь то, что выполнение этого может потребовать использовать tempdb
Во-первых, в оригинале эта фраза звучала, как
ptr128Queries that contain SELECT, INSERT, UPDATE, and DELETE statements can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.
Даже слова CTE в ней не было. Потому что она совсем из другой строки таблицы по ссылке.
Во-вторых, действительно, не любой запрос, содержащий "SELECT, INSERT, UPDATE, and DELETE" будет создавать "internal objects" и хранить их в tempdb. Для этого, у него, как минимум, должна возникнуть необходимость такой объект создать. А одно из необходимых (но не достаточное!) условий, для того, чтобы такой объект создался, как раз и есть "вложенный запрос". К которому цитата и относилась. 21051662

alexeyvgТут собрались люди, достаточно хорошо знающие сиквел, почитывающие блоги писателей ядра сиквела, и даже заходят те, кто сами пишет об этом книги, и им режет взгляд такая вольная интерпретация.
О господи! А уже подумал, что Вы хоть что-то понимаете в обсуждаемом вопросе. А Вы вдруг, как дите малое решили пиписьками меряться )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574132
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Уважаемый ptr128! Не могли бы вы к вашим оппонентам чуть-чуть с большим уважением относиться? Ну, чтобы профилактические баны не пришлось выписывать.

Спасибо за понимание.
Модератор: UPD: в этой теме это качается не только лишь некоторых. Давайте жить дружно, все дела.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574144
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgТут собрались люди, достаточно хорошо знающие сиквел, почитывающие блоги писателей ядра сиквела, и даже заходят те, кто сами пишет об этом книги, и им режет взгляд такая вольная интерпретация.
Приношу публично извинения за "пиписьками меряться". Вы меня не оскорбляли, в отличии от некоторых. Поэтому считаю, что я явно погорячился. Но мериться регалиями с незнакомыми людьми, право, не стоит.

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

Все, что я хотел донести, так это то, что при использовании CTE, табличных переменных и вложенных запросов, MS SQL не предоставляет возможности индексации результирующего набора данных. Что может привести (на больших объемах данных и сложных запросах) к худшей производительности, чем при явном использовании временных таблиц с разумно созданными индексами.

Если кто-то с этим не согласен - мне, по большому счету, безразлично. Жаль только тех, кто почитав весь этот прессинг на меня решит, что CTE, табличные переменные и вложенные запросы можно смело использовать на терабайтных БД и миллиардах записей.

Желающие могут дальше придираться к словам, стилическим и синтаксическим ошибкам и даже к конкретным буквам )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574158
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Все, что я хотел донести, так это то, что при использовании CTE, табличных переменных и вложенных запросов, MS SQL не предоставляет возможности индексации результирующего набора данных.Табличные переменные индексировать можно:
Код: sql
1.
declare @t table (Id int primary key);

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

Ваша проблема в том, что вы, со своими терабайтными объемами, зачем-то пришли в раздел форума, в котором, если явно не сказано иное, по умолчанию подразумевается OLTP-нагрузка. Т.е. точечные запросы. Вы уже второй олапер, за последнее время, кто приходит сюда и начинает мудро вещать, основываясь на своих умолчаниях. Именно этим обусловлена такая реакция профессионалов.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574192
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelТабличные переменные индексировать можно:[src]
declare @t table (Id int primary key);

Простите, у меня язык не повернулся назвать это возможностью индексирования. Это все же, скорее, ограничение (constraint). Да, это частный случай индексирования, но его возможности настолько уступают возможностям CREATE INDEX, что, лично для меня, этого уже достаточно для того, чтобы отказаться от использования табличных переменных. Благо временной таблицей их заменить можно всегда.

Ennor TiegaelИменно этим обусловлена такая реакция профессионалов.
И это Вы называете "реакцией профессионалов"? )))
TaPaKкак же таких sql то терпит....
дарагуля и де там про жизнь в оперативке?
упоротые бараны больше всего веселят
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574195
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

авторБлаго временной таблицей их заменить можно всегда.

дарагуля, давай пример замены в функции? Или как всегда скажешь, что не то имел ввиду?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574200
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKptr128,

авторБлаго временной таблицей их заменить можно всегда.

дарагуля, давай пример замены в функции? Или как всегда скажешь, что не то имел ввиду?
Детка, давай пример, опровергающий мое утверждение, или умолкни )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574202
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128TaPaKptr128,

пропущено...

дарагуля, давай пример замены в функции? Или как всегда скажешь, что не то имел ввиду?
Детка, давай пример, опровергающий мое утверждение, или умолкни )))
рыбка, я ж и говорю что ты опять несёшь чушь, что тут опровергать
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574204
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Явно пропустили. Где тут сказано, что всегда или обязательно ? Да, внутренние объекты SQL сервера, создаваемые при использовании CTE "размещал" и "размещаются" в tempdb. Если CTE, вложенные запросы и т.п. объектов не создают, то и размещать нечего.Опять "создаваемые при использовании CTE" :-)

Я вам в очередной раз скажу, что написание или ненаписание волшебного слова CTE совершенно не коррелирует с использованием сервером tempdb.

Мы же вроде это уже выяснили?
ptr128Во-первых, в оригинале эта фраза звучала, как
ptr128Queries that contain SELECT, INSERT, UPDATE, and DELETE statements can use internal objects to store intermediate results for hash joins, hash aggregates, or sorting.
Даже слова CTE в ней не было.Вот именно, не было.

Мы же обсуждаем ваши "объекты в tempdb, создаваемые запросом CTE", а не что то другое.
ptr128alexeyvgТут собрались люди, достаточно хорошо знающие сиквел, почитывающие блоги писателей ядра сиквела, и даже заходят те, кто сами пишет об этом книги, и им режет взгляд такая вольная интерпретация.
О господи! А уже подумал, что Вы хоть что-то понимаете в обсуждаемом вопросе. А Вы вдруг, как дите малое решили пиписьками меряться )))Ну, "разбираются, читают, пишут", это не только мерянье, но некий показатель знания контекста.

Просто смешно выглядит, мы тут перетираем с 2000 года работу сервера с tempdb в самых разных ситуациях, в разных версиях, чуть ли не раз в неделю (ну хорошо, раз в месяц). Представляете, 17 лет постоянно обсуждаем, аж в зубах скрипят эти объекты в tempdb. Я уже отвечаю на эти темы не сразу, надоело, 10 лет назад бы подхватил топик в течении 5 минут.
И тут приходит ptr128, и выдаёт такое :-)
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574219
Goga-Gola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot alexeyvg]ptr128И тут приходит ptr128, и выдаёт такое :-)

И "мэтры" начинают изъясняться языком школьников-дегенератов... "Дом-2" устроили...
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574229
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgПросто смешно выглядит, мы тут перетираем с 2000 года
А мне еще смешнее, так как я с удовольствием перешел с IDMS на DB/2 в 1989-ом, а свой первый интерпретатор SQL, естественно упрощенный, написал на C в 1995-ом. )))

Поймите, после того, как Вы начали говорить за всех (в курсе, что за всех говорят только демагоги?):
alexeyvgТут всем известно
все именно так


отказались аргументировать свои утверждения:
ptr128приведите доказательство того, что "обычный запрос из одной таблицы [...] без группировок" размещает внутренний объект в tempdb. И без сортировки, пожалуйста )
Выделите, пожалуйста, в нем слово HASH:
Где тут сказано, что всегда или обязательно?

смысла в продолжении общения просто нет.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574239
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Goga-GolaalexeyvgИ тут приходит ptr128, и выдаёт такое :-)
И "мэтры" начинают изъясняться языком школьников-дегенератов... "Дом-2" устроили...Все "мэтры" вдруг поменяли язык? Или один-два человека ляпнули?
В этом топике хватает и нормального обсуждения. "Дом-2" от кого то невоспитанного не отменяет "И тут приходит ptr128, и выдаёт такое :-)"

Ой, ну вот, второй пост ptr128 в этом топике:
ptr128Руслан Дамирович
Код: sql
1.
WITH



Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?Конечно же, это ещё какой перл, противоречащий всем последующим объяснениям, цитатам и тестам.
Всех резануло это высказывание, по сути - "ключевое слово WITH автоматически созадёт временную таблицу на каждое написание".

И главное, не факт ошибки (у меня на форуме горы ошибок), а упорное отстаивание явного ляпа.
Надо было просто сказать: ой, ошибся, не так понял прочитанную статью, не CTE неявно создаёт временные таблицы, а определённые операторы исполнения в database engine. И всё, сразу видно - человек знает, что мало знает, значит, профессионал.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574243
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Поймите, после того, как Вы начали говорить за всех (в курсе, что за всех говорят только демагоги?):
alexeyvgТут всем известно
все именно так


отказались аргументировать свои утверждения:
ptr128приведите доказательство того, что "обычный запрос из одной таблицы [...] без группировок" размещает внутренний объект в tempdb. И без сортировки, пожалуйста )
Выделите, пожалуйста, в нем слово HASH:
Где тут сказано, что всегда или обязательно?Ээээ, про слово HASH бездоказательно???
Вот 2 запроса с worktable
Код: sql
1.
2.
3.
4.
5.
6.
;WITH C(I) AS (SELECT TOP 1 number FROM master..spt_Values ),X AS (SELECT a.I FROM C a INNER HASH JOIN C b ON a.I = b.I) SELECT * FROM x

SELECT TOP 1 a.number 
    FROM master..spt_Values a 
        INNER HASH JOIN master..spt_Values b 
        ON a.number = b.number

Вот 2 запроса без worktable
Код: sql
1.
2.
3.
4.
5.
6.
;WITH C(I) AS (SELECT TOP 1 number FROM master..spt_Values ),X AS (SELECT a.I FROM C a INNER JOIN C b ON a.I = b.I) SELECT * FROM x

SELECT TOP 1 a.number 
    FROM master..spt_Values a 
        INNER JOIN master..spt_Values b 
        ON a.number = b.number


Теперь перечитываем утверждение, которое вы отстаиваете:
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574247
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgТеперь перечитываем утверждение, которое вы отстаиваете:
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?Ещё раз, мы обсуждаем именно это ваше утверждение.

Придёт какой то начинающий сиквелист, прочитает мнение эксперта ptr128, потом посмотрит на свой код.
- Таак, у меня тут 3 слова CTE, значит, создаются 3 (или 6?) временных таблиц в tempdb

А это не так, наличие или отсутствие CTE никак не коррелдирует с временными объектами, оно зависит от плана выполнения запроса.

Вот это мы тут говорим, и именно подтверждение или опровержение этого мы ищем в предоставленных вами ссылках, и ничто другое, никакие другие условия или признаки создания временных объектов.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574253
Руслан Дамирович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жара, мать иё! А задача ТСа так и не решена!
Клиенты не платят - бизнес страдает!
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574257
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
Я могу согласиться с тем, что фраза была высказана излишне категорично. К тому же уже доказано было выше, что использование синтаксиса CTE не всегда приводит к созданию временных таблиц. Ну или, как Вы выражаетесь, "не всегда приводит к тому, что определенные операторы исполнения в database engine создают временные таблицы". Был не прав. Привык гонять своих разработчиков кратко. Благо живых примеров такого кода на продуктивных базах клиентов, хоть завались, и продемонстрировать разницу - минута. Надо было сразу писать что-то вроде "Написание запросов при помощи CTE может привести (а при разработке и развитии продукта - точно приведет) к неявному созданию неиндексированных объектов в tempdb, что приведет к потере производительности, по сравнению с использованием временных таблиц с разумными индексами". Или не писать вообще - пусть у конкурентов все работает медленней )

alexeyvg"ключевое слово WITH автоматически созадёт временную таблицу на каждое написание".

А вот когда слова оппонетна перефразируют по своему разумению - это называется "демагогия".


alexeyvgне CTE неявно создаёт временные таблицы, а определённые операторы исполнения в database engine.
Вы видите принципиальную разницу между фразами?
"Объекты CTE размещаются в tempdb"
"Объекты создаваемые CTE размещаются в tempdb"
"Объекты создаваемые при использоании синтаксиса CTE размещаются в tempdb"
"Объекты создаваемые операторами database engine при использоании синтаксиса CTE размещаются в tempdb"

Лично я не вижу. Поэтому, если бы Вы попросили уточнить мою фразу, так как она Вам непонятна, то сразу же получили бы последний вариант. Вы же предпочли придраться к словам и интерпретировать мою фразу исключительно одним способом, удобным для Вас. Даже не смотря на то, что и Вы и я в курсе, что CTE - не более чем синтаксическая конструкция.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574263
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgЭэээ, про слово HASH бездоказательно???
Вот 2 запроса с worktable

Убедительная просьба прекратить нагло врать! Скриншот сюда. Чтобы было видно, что это я написал, а не отковотил то, что написал кто-то другой.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574267
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Руслан ДамировичЖара, мать иё! А задача ТСа так и не решена!
Клиенты не платят - бизнес страдает!
После поста 21053000 он молчит. Видимо, все получилось.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574278
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128alexeyvg"ключевое слово WITH автоматически созадёт временную таблицу на каждое написание".

А вот когда слова оппонетна перефразируют по своему разумению - это называется "демагогия".Да, это очень доказательно, назвать "демагогией" :-)

Моя интерпретация вашей фразы ровно такая же, как интерпретация любого другого человека. Её нельзя понять по другому.

Ауууу, кто то понял фразу по другому, отзовитесь!!!

ptr128alexeyvgне CTE неявно создаёт временные таблицы, а определённые операторы исполнения в database engine.
Вы видите принципиальную разницу между фразами?
"Объекты CTE размещаются в tempdb"
"Объекты создаваемые CTE размещаются в tempdb"
"Объекты создаваемые при использоании синтаксиса CTE размещаются в tempdb"
"Объекты создаваемые операторами database engine при использоании синтаксиса CTE размещаются в tempdb"

Лично я не вижу. Поэтому, если бы Вы попросили уточнить мою фразу, так как она Вам непонятна, то сразу же получили бы последний вариант. Вы же предпочли придраться к словам и интерпретировать мою фразу исключительно одним способом, удобным для Вас. Даже не смотря на то, что и Вы и я в курсе, что CTE - не более чем синтаксическая конструкция.Я не вижу разницы. Это совершенно идентичные неверные высказывания. Тут просто слово CTE лишнее. Она заставит прочитавшего человека искать CTE (слово WITH), что бы убрать оверхед по созданию временных таблиц. А это неправильно, искать нужно по другим признакам, а не по "WITH"

Да вы прямо про это пишите, процитирую в сотый раз:
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574281
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Надо было сразу писать что-то вроде "Написание запросов при помощи CTE может привести (а при разработке и развитии продукта - точно приведет) к неявному созданию неиндексированных объектов в tempdb, что приведет к потере производительности, по сравнению с использованием временных таблиц с разумными индексами"Жесть, но это же не связано, мы это уже обсуждаем очень долго :-)

Переписывание "без CTE" сделает абсолютно идентичный план запроса, с использованием worktable или без использования - вот прямо как было, так и останется.
ptr128Привык гонять своих разработчиков краткоБедолаги :-) Пыхтят, убирают CTE, потому что начальнику не нравится, но картинка с планом остаётся абсолютно такая же :-) Самодур :-)
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574282
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
"Объекты CTE размещаются в tempdb"
"Объекты создаваемые CTE размещаются в tempdb"
"Объекты создаваемые при использоании синтаксиса CTE размещаются в tempdb"
"Объекты создаваемые операторами database engine при использоании синтаксиса CTE размещаются в tempdb"

Лично я не вижу.
Яб согласился слышать такое от гуманитария, но для человека, который делает заявку на то, что он профессиональный программист - это вопиющая безграмотность. Я могу только удивляться тому, что на таком уровне восприятия реальности у тебя есть какие-то там "твои программисты"

Но займемся семантикой. Сиречь значением слов.
автор"Объекты CTE размещаются в tempdb" : {СТЕ является типом объектов. Когда создается объект типа СТЕ, его метаданные и данные всегда размещаются в tempdb}
автор"Объекты создаваемые CTE размещаются в tempdb" : {Мы не знаем , является ли СТЕ "типом" в обычно понимании, но очевидно, что СТЕ это некий механизма, который может породить создание каких-то объектов. При каких-то условиях, эти объекты могут размещаться в tempdb }
автор"Объекты создаваемые при использоании синтаксиса CTE размещаются в tempdb":{ СТЕ это некая форма записи когда , которая приводит к созданию объектов , которые всегда размещаются в tempdb }
автор"Объекты создаваемые операторами database engine при использоании синтаксиса CTE размещаются в tempdb"
Ну тут смысл аналогичен предыдущему.

Итак, что мы видим? Что поциент а) не видит разницы в принципиально разных высказываниях б) каждое их этих высказываний ложное, потому, что:
1 - СТЕ не является типом, для СТЕ нет экземпляров, соответственно нельзя разместить в темпдб то, чего нет;
2 - СТЕ не создает объектов, объекты создает движок бд, и размещает их в тембдб когда считает нужным;
3 - объекты, которые были созданы при использовании синтаксиса СТЕ не всегда размещаются в темпбд;
4 - объекты, которые были созданы при использовании синтаксиса СТЕ не всегда размещаются в темпбд.

В общем, поздравляем вас соврамши, гражданин "я-писал-интерпретатор-пока-вы-в-ясли-ходили"
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574286
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cammomile : {Мы не знаем , является ли СТЕ "типом" в обычно понимании, но очевидно, что СТЕ это некий механизма, который может породить создание каких-то объектов. При каких-то условиях, эти объекты могут размещаться в tempdb }
Поменять на
: {Мы не знаем , является ли СТЕ "типом" в обычно понимании, но очевидно, что СТЕ это некий механизма, который может породить создание каких-то объектов. Эти объекты всегда размещаются в tempdb }
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574289
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgно картинка с планом остаётся абсолютно такая же
ptr128по сравнению с использованием временных таблиц с разумными индексами"
Вы действительно утверждаете, что план запроса не зависит от индексов???? Занавес...
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574300
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128alexeyvgно картинка с планом остаётся абсолютно такая же
ptr128по сравнению с использованием временных таблиц с разумными индексами"
Вы действительно утверждаете, что план запроса не зависит от индексов???? Занавес...Жесть. Я обсуждаю ваше высказывание про CTE, при чём тут индексы?
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574301
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CammomileНо займемся семантикой. Сиречь значением слов.
Cammomileслышать такое от гуманитария
Но тогда почему Вы сами рассуждаете, как гуманитарий? Я действительно не расчитывал, что мою фразу будет читать гуманитарий, да еще и не знающий,
ptrчто CTE - не более чем синтаксическая конструкция.

CammomileСТЕ является типом объектов
А в фразе "объекты строительства, транспорта и благоустройства" строительство, транспорт и благоустройство тоже является, по Вашему, типом объектов? )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574306
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgptr128Вы действительно утверждаете, что план запроса не зависит от индексов???? Занавес...Жесть. Я обсуждаю ваше высказывание про CTE, при чём тут индексы?
Я уже говорил неоднократно.
ptr128при использовании CTE, табличных переменных и вложенных запросов, MS SQL не предоставляет возможности индексации результирующего набора данных. Что может привести (на больших объемах данных и сложных запросах) к худшей производительности, чем при явном использовании временных таблиц с разумно созданными индексами.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574315
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgptr128Надо было сразу писать что-то вроде "Написание запросов при помощи CTE может привести (а при разработке и развитии продукта - точно приведет) к неявному созданию неиндексированных объектов в tempdb, что приведет к потере производительности, по сравнению с использованием временных таблиц с разумными индексами"Жесть, но это же не связано
Что это и с чем не связано?
Или мне, последовать Вашему примеру и самому придумать, что таоке "это" и с "чем" оно не связано. Ну, например, Ваша лживость (где скриншот?) и акоголизм )))
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574316
iiyama
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, Сергей Алексеевич уже попросил быть более сдержанными. Вы уже 5 страниц толчёте воду в ступе. Пользы от топика =0,01% с учетом того что автор исчез(вроде бы довольным)
ПиЭс. Топик сделал мне пятницу, но лучше закрыть его
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574320
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgЖесть. Я обсуждаю ваше высказывание про CTE, при чём тут индексы?
Изучите статью

We recently assisted a global ISV to address a performance issue related to a poor performing recursive CTE (Common Table Expression). The ISV wanted the query that was running in excess of 3 minutes to run in less than 15 seconds on their servers. The end result of our efforts was a 3,600% performance improvement.

Recursive CTE queries do have a reliance on the unique parent/child keys in order to get the best performance.

Это ровно то, что я и утверждал изначально.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574370
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128Rismenпропущено...


Если открыть бд, то в таблице Residency столбце PriceOfResidency полная стоимость за проживание. В таблице Payment столбце Pay сколько оплачено. И нужно вывести тех клиентов, которые либо не заплатили, либо оплатили частично.
Я вижу, что клиенты 1,2,3 полностью оплатили.
В запросе я, так как писал его без БД, неправильно указал имя поля. Вместо SUM(ISNULL(P.Payment,0)) должно быть SUM(ISNULL(P.Pay,0))
И запрос честно выдает оставшихся двух клиентов.

Еще раз запрос, с исправленным именем поля:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, MAX(R.PriceOfResidency) AS PriceOfResidency, SUM(ISNULL(P.Pay,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005


Спасибо, запрос выдаёт нужных клиентов, но только цифры не те
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574372
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RismenСпасибо, запрос выдаёт нужных клиентов, но только цифры не те
База у меня есть. Уточните, что не так с цифрами, pls.
...
Рейтинг: 0 / 0
Вложенный запрос
    #39574373
Rismen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128Rismenпропущено...


Если открыть бд, то в таблице Residency столбце PriceOfResidency полная стоимость за проживание. В таблице Payment столбце Pay сколько оплачено. И нужно вывести тех клиентов, которые либо не заплатили, либо оплатили частично.
Я вижу, что клиенты 1,2,3 полностью оплатили.
В запросе я, так как писал его без БД, неправильно указал имя поля. Вместо SUM(ISNULL(P.Payment,0)) должно быть SUM(ISNULL(P.Pay,0))
И запрос честно выдает оставшихся двух клиентов.

Еще раз запрос, с исправленным именем поля:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT C.Surname, SUM(Q.PriceOfResidency)-SUM(Q.Payment) AS Debt
FROM Clients C
JOIN (SELECT R.ClientID, MAX(R.PriceOfResidency) AS PriceOfResidency, SUM(ISNULL(P.Pay,0)) AS Payment
  FROM Residency R
  LEFT JOIN Payment P ON R.ResidencyID=P.ResidencyID
  GROUP BY R.ClientID, R.ResidencyID ) Q
  ON C.ClientID=Q.ClientID
GROUP BY Surname
HAVING ABS(SUM(Q.PriceOfResidency)-SUM(Q.Payment))>0.005



Ох, слепая, извините. Всё работает, спасибо за помощь!
...
Рейтинг: 0 / 0
126 сообщений из 126, показаны все 6 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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