powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос
25 сообщений из 126, страница 3 из 6
Вложенный запрос
    #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
25 сообщений из 126, страница 3 из 6
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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