Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос / 25 сообщений из 126, страница 1 из 6
20.12.2017, 17:22
    #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
20.12.2017, 17:30
    #39572959
xenix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Rismen,
Код: sql
1.
(SELECT Pay FROM Payment)


может, тут SUM(Pay)
?
...
Рейтинг: 0 / 0
20.12.2017, 17:33
    #39572962
Rismen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
xenix, нет, тогда выводит около 675 строк, а должен 3
...
Рейтинг: 0 / 0
20.12.2017, 17:40
    #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
20.12.2017, 21:34
    #39573080
Rismen
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
TaPaK,
всё равно не выводит, то что нужно. Могу скинуть саму базу данных https://drive.google.com/open?id=1TVcrxWEFqn7zERAubE7-3qoeV3eKyLwY
...
Рейтинг: 0 / 0
20.12.2017, 23:19
    #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
21.12.2017, 11:10
    #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
21.12.2017, 11:19
    #39573359
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Руслан Дамирович
Код: sql
1.
WITH


Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
...
Рейтинг: 0 / 0
21.12.2017, 11:22
    #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
21.12.2017, 11:27
    #39573369
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
ptr128Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
Такое ощущение, что ты из PL/SQL пришёл. или из будущего, где MS SQL научился WITH материализовывать.
ptr128Ноль пропустил. Исправлено.
2. Твой скрипт изначально некорректно считает, мелкими исправлениями ты его не улучшишь.
...
Рейтинг: 0 / 0
21.12.2017, 12:28
    #39573451
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
Руслан Дамировичptr128Для чего в этой задаче CTE?
MS SQL научился WITH материализовывать.[/quot]
Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb


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

ptr128А если не как в церкви, без догм?
Не получится, я верю только в чистый и понятный код.[/quot]
Это чей код Вы называете "чистым"?
Откуда Вы вообще взяли, что в таблце Payment есть поле ClientID? У ТС таблица Payment связана только с Residency через ResidencyID.
...
Рейтинг: 0 / 0
21.12.2017, 12:54
    #39573492
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
[quot ptr128
Объекты CTE[/quot]
Расскажи-ка нам подробнее, что за "объекты СТЕ".
...
Рейтинг: 0 / 0
21.12.2017, 12:59
    #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
21.12.2017, 13:04
    #39573509
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
CammomileРасскажи-ка нам подробнее, что за "объекты СТЕ".
Почитайте
...
Рейтинг: 0 / 0
21.12.2017, 13:04
    #39573511
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
ptr128,

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

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

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

авторA r e essentially disposable VIEWs
...
Рейтинг: 0 / 0
21.12.2017, 13:32
    #39573547
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вложенный запрос
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вложенный запрос / 25 сообщений из 126, страница 1 из 6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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