Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
 Вложенный запрос  [new]
Rismen
Member

Откуда:
Сообщений: 11
Прошу помочь с вложенным запросом. Необходимо вывести клиентов и сумму их задолженности. Я это делаю так, но выдает ошибку "
Вложенный запрос вернул больше одного значения. Это запрещено, когда вложенный запрос следует после =, !=, <, <=, >, >= или используется в качестве выражения."
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);
20 дек 17, 17:22    [21049566]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
xenix
Guest
Rismen,
(SELECT Pay FROM Payment)

может, тут SUM(Pay)
?
20 дек 17, 17:30    [21049598]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Rismen
Member

Откуда:
Сообщений: 11
xenix, нет, тогда выводит около 675 строк, а должен 3
20 дек 17, 17:33    [21049606]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Rismen,
автор
огда выводит около 675 строк, а должен 3

допишите SELECT TOP 3 иначе не спасти.

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

на угад как-то так
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);
20 дек 17, 17:40    [21049634]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Rismen
Member

Откуда:
Сообщений: 11
TaPaK,
всё равно не выводит, то что нужно. Могу скинуть саму базу данных https://drive.google.com/open?id=1TVcrxWEFqn7zERAubE7-3qoeV3eKyLwY
20 дек 17, 21:34    [21050138]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
TaPaK
на угад как-то так

Как я понимаю, могут быть клиенты без единого платежа.
Тогда уж так:
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
20 дек 17, 23:19    [21050419]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
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 )
21 дек 17, 11:10    [21050990]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Руслан Дамирович
WITH

Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?
21 дек 17, 11:19    [21051012]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Ноль пропустил. Исправлено.

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
21 дек 17, 11:22    [21051022]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ptr128
Для чего в этой задаче CTE? Две временные таблицы неявно Вы создаете - это потеря производительности. А выигрыш в чем?

Такое ощущение, что ты из PL/SQL пришёл. или из будущего, где MS SQL научился WITH материализовывать.
ptr128
Ноль пропустил. Исправлено.

2. Твой скрипт изначально некорректно считает, мелкими исправлениями ты его не улучшишь.
21 дек 17, 11:27    [21051043]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Руслан Дамирович
ptr128
Для чего в этой задаче CTE?

MS SQL научился WITH материализовывать.
[/quot]
Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb


Руслан Дамирович
2. Твой скрипт изначально некорректно считает, мелкими исправлениями ты его не улучшишь.

А если не как в церкви, без догм? В чем претензии?
21 дек 17, 12:28    [21051358]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
ptr128
Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb

Шедевральное заблуждение.
ptr128
А если не как в церкви, без догм?

Не получится, я верю только в чистый и понятный код.
21 дек 17, 12:37    [21051397]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Руслан Дамирович
ptr128
Он от момента рождения CTE так и делал. Попробуйте прогнать CTE на большим объемом данных и понаблюдайте за Tempdb

Шедевральное заблуждение.

Опять догма?
Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb. При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTP. Когда же объем данных большой, то уходим на диск.
Кстати, именно когда я обнаружил, что CTE - не более, чем "ситаксический сахар", но без возможности указания необходимых индексов для временных таблиц, я от него отказался. Уже на нескольких миллионах записей иерархии, глубиной всего в десяток уровней, разница в производительности стала заметна на глаз.

ptr128
А если не как в церкви, без догм?

Не получится, я верю только в чистый и понятный код.[/quot]
Это чей код Вы называете "чистым"?
Откуда Вы вообще взяли, что в таблце Payment есть поле ClientID? У ТС таблица Payment связана только с Residency через ResidencyID.
21 дек 17, 12:50    [21051477]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
[quot ptr128
Объекты CTE[/quot]
Расскажи-ка нам подробнее, что за "объекты СТЕ".
21 дек 17, 12:54    [21051502]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Суммы будут не верно считаться, для PriceOfResidency

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

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
21 дек 17, 12:59    [21051535]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Cammomile
Расскажи-ка нам подробнее, что за "объекты СТЕ".

Почитайте
21 дек 17, 13:04    [21051562]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ptr128,

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

как же таких sql то терпит....
21 дек 17, 13:04    [21051567]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
TaPaK
ptr128,

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

как же таких sql то терпит....

Самокритично
21 дек 17, 13:10    [21051586]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9350
ptr128
Объекты CTE, табличных переменных, вложенных запросов и т.п. размещаются в tempdb.
Ждем ссылку на документацию. Или, хотя бы, репро.
ptr128
При этом, пока хватает оперативки, вся tempdb живет в in-memory OLTP
А когда in-memory OLTP еще не было?
Опять же, ждем ссылку на документацию.
21 дек 17, 13:10    [21051587]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ptr128,
дарагуля и де там про жизнь в оперативке?
21 дек 17, 13:15    [21051607]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
invm
А когда in-memory OLTP еще не было?
Опять же, ждем ссылку на документацию.

Когда не было - непосредственно в tempdb.
Ссылка выше.
21 дек 17, 13:16    [21051609]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
TaPaK
ptr128,
дарагуля и де там про жизнь в оперативке?

Деточка, а Вы не знали, что, пока достаточно оперативки, TempDB в ней и живет?
21 дек 17, 13:18    [21051614]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ptr128
TaPaK
ptr128,
дарагуля и де там про жизнь в оперативке?

Деточка, а Вы не знали, что, пока достаточно оперативки, TempDB в ней и живет?

нет, а ms об этом знает? может даже пишут где?

ну и про это тоже
автор
табличных переменных, вложенных запросов и т.п. размещаются в tempdb.

упоротые бараны больше всего веселят
21 дек 17, 13:20    [21051620]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
ptr128
Cammomile
Расскажи-ка нам подробнее, что за "объекты СТЕ".

Почитайте

Сам то справился ссылку свою прочитать?

автор
Are essentially disposable VIEWs
21 дек 17, 13:29    [21051643]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46983
Какие операции юзают tempdb ???

К сообщению приложен файл. Размер - 54Kb
21 дек 17, 13:32    [21051656]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить