Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 39
1

Нужно оптимизировать SQL запрос

12.04.2017, 22:40. Показов 1764. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой запрос:
INSERT INTO DMZ (DDM,NDM,PR)
SELECT GETDATE() DDM,
(isnull((SELECT MAX(NDM) FROM DMZ),0)+1) NDM,
CASE WHEN isnull((SELECT COUNT() FROM DMZ WHERE PR=1),0)>isnull((SELECT COUNT() FROM DMZ WHERE PR=2),0)
THEN 2
ELSE 1 END

Изначальное задание такое: Скопировать строки из одного документа в другой с игнорированием дубликатов. 1)Скопировать из документа с минимальным номером. 2) В документ с максимальным номером. 3) Считать, что в заголовке есть по крайней мере одна запись. 4)При добавлении пропускать (не добавлять) строки по товарам ,которые уже есть.

Таблица DMZ - документ.DDM - дата, NDM- номер документа,PR - приход/расход товара(1- приход, 2 - расход) Вопрос таков : Как можно с целью оптимизации запроса избавиться от подзапросов, получая значения для полей вставляемых записей одной инструкцией SELECT. ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.04.2017, 22:40
Ответы с готовыми решениями:

Как оптимизировать sql-запрос?
Подскажите пожалуйста, как можно оптимизировать запрос SELECT t3._Fld19180 AS "Время",...

Нужно составить SQL запрос с выборкой из разных таблиц
В общем, такая ситуация: Есть таблица Invoice_Itemized и таблица Invoice_Totals Мне нужно одним...

SQL подобные запросы к гугл таблицам. Нужно составить запрос
здравствуйте есть гугл табличка, которая принимает "SQL" запросы такого вида...

SQL запрос. Из названия нужно убрать лишнее слова по списку из другой таблицы
Есть столбик с названием продукта. Из названия нужно убрать лишнее слова. Список лишних слов...

7
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
13.04.2017, 00:08 2
Цитата Сообщение от qrbio Посмотреть сообщение
Нужно оптимизировать SQL запрос
не имеющий никакого отношения к первоначальному заданию?
ЕСЛИ DMZ таблица документов, то их трогать не нужно, нужно копировать записи из подчиненной таблицы, про структуру которой у вас ни слова, а если это уже подчиненная таблица, то откуда у каждой записи дата? и где атрибут товара, строки по которым надо пропускать, если они есть?

Не зная структуры вообще запрос написать нельзя, а вам ещё и оптимальный нужен
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,269
13.04.2017, 11:02 3
Цитата Сообщение от qrbio Посмотреть сообщение
1)Скопировать из документа с минимальным номером. 2) В документ с максимальным номером. 3) Считать, что в заголовке есть по крайней мере одна запись.
Это точно на русском языке написано?
Ничего непонятно.
Может, простым языком расскажете, что надо? С примером?
0
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 39
18.04.2017, 16:01  [ТС] 4
В общем...Сейчас от меня следует огроменное извинение. Будучи в сосем сонном состоянии я перепутала задание и вставила совсем не то.
Если это еще что-то читает, вот задание, которое до сих пор не очень нужно решить:
Добавить новый заголовок документа (одной командой insert) -Номер документа = последний номер документа+1 -Дата=текущая дата -Тип=расход,если документов типа "приход "больше ,чем документов типа "расход".В противном случае тип=приход. -Учесть,что в таблице DMZ изначально может не быть ни одной строки.

Таблица DMZ - документ.DDM - дата, NDM- номер документа,PR - приход/расход товара.Вставляю диаграмму бд , если чем-то поможет.

Запрос работает , но его нужно немного оптимизировать,заменив два запроса в операторе CASE на один. Как это можно сделать?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
18.04.2017, 16:58 5
Лучший ответ Сообщение было отмечено qrbio как решение

Решение

SQL
1
2
3
4
5
6
7
8
9
INSERT INTO DMZ (DDM,NDM,PR)
SELECT 
  GETDATE(),  ISNULL(MAX(NDM), 0) + 1, 
  CASE 
    WHEN ISNULL(SUM(CASE PR WHEN 1 THEN 1 ELSE 0), 0) > ISNULL(SUM(CASE PR WHEN 2 THEN 1 ELSE 0), 0) 
    THEN 2 
    ELSE 1 
  END 
FROM DMZ
2
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 39
18.04.2017, 17:14  [ТС] 6
Ругается на скобки
WHEN ISNULL(SUM(CASE PR WHEN 1 THEN 1 ELSE 0), 0) > ISNULL(SUM(CASE PR WHEN 2 THEN 1 ELSE 0), 0)

Добавлено через 5 минут
Пишет , что неверный синтаксис около этих двух скобок.
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
18.04.2017, 17:19 7
end-ов не хватает закрывающих после 0-ей
0
0 / 0 / 0
Регистрация: 10.09.2016
Сообщений: 39
18.04.2017, 17:37  [ТС] 8
Все равно ругается(

А каким-то таким подходом, как здесь , нельзя сделать?
SELECT t.NTOV,
SUM(s.KOL*(1-(d.PR-1)))-SUM(s.KOL*(d.PR-1)) as KOL,
SUM(s.CENA*(1-(d.PR-1)))-SUM(s.CENA*(d.PR-1)) as SUMMA
FROM DMS s
INNER JOIN TOV t on t.KTOV=s.KTOV
INNER JOIN DMZ d on d.NDM=s.NDM
GROUP BY t.NTOV ORDER BY t.NTOV
Тут определяется количество и сумма остатка (если 1 - приход, 2 - расход)

Добавлено через 5 минут
Хотя, вы вроде так и сделали ... Сори

Только ошибку так и не могу убрать

Добавлено через 5 минут
Все,ошибку нашла. Спасибо вам большое! Теперь разобралась с этим запросом, а дополнительно узнала и что такое PIVOT, как его заменять на кейсы и наоборот.
0
18.04.2017, 17:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2017, 17:37
Помогаю со студенческими работами здесь

Оптимизировать запрос
Добрый день. Подскажите пожалуйста можно ли как то оптимизировать такой запрос занимает очень...

Оптимизировать запрос!
Всем хорошего дня! Написал запрос, который выбирает записи из более чем 500 тыс. записей ...

Оптимизировать запрос
Вопрос в том, что данный запрос выполняется относительно долго можно ли ускорить выполнение? по...

Помоги оптимизировать запрос
ПОмогите пожалуйста вот запрос SELECT Con_string, TablesName, Once, Days, Weeks FROM TablesChecker...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru