Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21

Sql запрос завешивает программу

19.08.2014, 18:48. Показов 1697. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, такая проблема, есть работающий запрос (сократил, тк он большой):
SQL
1
2
3
4
SELECT TOP 10 NUMBER, <несколько других столбцов>  FROM таблица1 
WHERE <несколько условий на столбцы> AND NUMBER IN 
(SELECT NUMBER FROM таблица2  WHERE <условие на столбцы из таблицы2>) 
AND NUMBER IN (SELECT NUMBER FROM таблица3 WHERE <условие на столбцы из таблицы3>)
этот запрос работает, если я указываю его в OleDbDataAdapter и им заполняю DataSet, далее допустим я хочу узнать сколько всего строк, не ограничивая числом 10, для этого использую след. код
C#
1
2
OleDbCommand MyCommand = new OleDbCommand(commandString, conn);
object o = MyCommand.ExecuteScalar();
где commandString как предыдущий запрос, отличается только в начале:
SQL
1
2
3
4
SELECT COUNT(NUMBER) FROM таблица1 
WHERE <несколько условий на столбцы> AND NUMBER IN 
(SELECT NUMBER FROM таблица2  WHERE <условие на столбцы из таблицы2>) 
AND NUMBER IN (SELECT NUMBER FROM таблица3 WHERE <условие на столбцы из таблицы3>)
но при его выполнении происходит зависание, есть идеи что здесь не так? (более простой запрос в OleDbCommand работает)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.08.2014, 18:48
Ответы с готовыми решениями:

Запрос в сеть завешивает приложение
Прога зависает с запроса в сеть. Какими способами это можно изолировать? Пробовал делать в новом потоке и снимать поток при зависании....

Простой цикл завешивает программу
Доброго времени суток. Пишу программу которая сосчитает количество раз,которое встречается заданная цифра в числах заданного промежутка....

Создать программу через SQL-запрос
Создать программу которая будет создавать таблицу &quot;успеваемость студентов&quot; . После этого созданная таблица должна открываться для...

20
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.08.2014, 19:06
попробуйте
T-SQL
1
2
3
4
SELECT COUNT(*) FROM таблица1 
WHERE <несколько условий на столбцы> AND NUMBER IN 
(SELECT NUMBER FROM таблица2  WHERE <условие на столбцы из таблицы2>) 
AND NUMBER IN (SELECT NUMBER FROM таблица3 WHERE <условие на столбцы из таблицы3>)
Добавлено через 41 секунду
а как вы создаете такой запрос и как он выглядит если вы не указываете ограничения?
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
19.08.2014, 19:11  [ТС]
Цитата Сообщение от Learx Посмотреть сообщение
попробуйте
T-SQL
1
2
3
4
SELECT COUNT(*) FROM таблица1 
WHERE <несколько условий на столбцы> AND NUMBER IN 
(SELECT NUMBER FROM таблица2  WHERE <условие на столбцы из таблицы2>) 
AND NUMBER IN (SELECT NUMBER FROM таблица3 WHERE <условие на столбцы из таблицы3>)
Добавлено через 41 секунду
а как вы создаете такой запрос и как он выглядит если вы не указываете ограничения?
Да, пробовал, одинаково.
создается на половину программа - пользователь указывает в форме параметры поиска. Ну под "условия на столбцы" я и имел ввиду ограничения
0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
19.08.2014, 19:23
nunnt,1) пользователь вводит данные.
2) вы говорите запрос без фильтра
3) вы формируете запрос с пустыми данными? или у вас жестко прописан запрос?
4) если формируете, то в отладчике проверьте что там получается с пустыми данными, может там некорректный запрос
а так сказать что-то больше невозможно - слишком мало информации.
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
19.08.2014, 21:06  [ТС]
Learx, вот такой примерно запрос образуется перед вызовом MyCommand
SQL
1
2
3
4
5
6
SELECT COUNT(*) FROM таб1 
WHERE дата1 BETWEEN #1/1/1990# AND #8/19/2014# AND дата2 BETWEEN #1/1/1990# AND #8/19/2014# 
AND (Name LIKE "%лопата%" OR Descrip LIKE "%лопата%" ) 
AND (code = 'RU' OR code = 'FO' OR code = 'JO') 
AND NUMBER IN (SELECT NUMBER FROM таб2 WHERE Id LIKE "%11%" ) 
AND NUMBER IN (SELECT NUMBER FROM таб3 WHERE Id2 LIKE "%22%" )
запрос скорее всего нормальный, раз практически такой же работает с DataSet, я думал может вот эти вложенные подзапросы долго вычисляются и их как-то можно лучше написать или что подобное

Добавлено через 1 час 31 минуту
без двух последних строчек запрос работает, вот именно с подзапросами возникает зависание
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 05:54
nunnt,
T-SQL
1
2
3
4
5
SELECT TOP 10 t1.NUMBER, t1.<несколько других столбцов>  
FROM таблица1 as t1
INNER JOIN таблица2 as t2 ON t2.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы2>
INNER JOIN таблица3 as t3 ON t3.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы3>
WHERE <несколько условий на столбцы>
По сути это дело не меняет, если у вас настолько много данных и слабый сервер, что запрос не может выполниться, то тут уже что-то с самой БД делать надо, индексы где надо повешать, например.

Что за СУБД то?
1
20.08.2014, 06:19

Не по теме:

Цитата Сообщение от Cupko Посмотреть сообщение
Что за СУБД то?
Если смотреть на формат записи дат, то похоже на MS ACCESS)

0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 07:19  [ТС]
Cupko, у меня number в таблица1 - уникальное поле, а в таблица2 и таблица3 может повторяться в строках, я правильно понимаю, что INNER JOIN для этого не подходит? а что можно сделать с БД?, в двух этих таблицах фактически два столбца один из которых номер.
да, access, я думал позже перейти на что-нибудь типо mysql, если это ускорит процесс - сейчас буду переходить, хотя странно, не в этом должна быть проблема, если убрать TOP 10 из первого запроса, то DataSet заполняется полностью базой за секунд 16, наверняка второй должен выполниться
0
 Аватар для kodv
1449 / 1121 / 347
Регистрация: 11.04.2011
Сообщений: 2,621
20.08.2014, 07:28
Цитата Сообщение от nunnt Посмотреть сообщение
у меня number в таблица1 - уникальное поле, а в таблица2 и таблица3 может повторяться в строках, я правильно понимаю, что INNER JOIN для этого не подходит?
Вы заблуждаетесь. В секции ON оператра JOIN могут находится любые условия.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 07:31
Цитата Сообщение от nunnt Посмотреть сообщение
что INNER JOIN для этого не подходит?
Можно, конечно, distinct повешать, но это костыль на самом деле. Так что да, иннер джоин тут-таки не очень вписывается. Пока ничего другого придумать не могу.
Цитата Сообщение от nunnt Посмотреть сообщение
если убрать TOP 10 из первого запроса, то DataSet заполняется полностью базой за секунд 16, наверняка второй должен выполниться
Вот это действительно странно, и тут у меня идей вообще нет, ибо с Access я не работал.

Можно, конечно, и на клиенте количество записей посчитать, но это опять же, не очень хорошее решение проблемы.

kodv, С джоином данные дублироваться просто будут, думаю это автор имел в виду.
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 08:12  [ТС]
Cupko, я думал, что джоин присоединит к конкретной строке из таблицы1 не более одной строки из других таблиц, если он продублирует строку из таблицы1, то это подойдет, сейчас попробую (не очень знаком с джоином, извиняюсь)
на клиенте здорово конечно и быстро, только программка гид весит в оперативке..

Добавлено через 32 минуты
Cupko, а можно еще один вопрос? у меня работает такой запрос
T-SQL
1
2
SELECT COUNT(t1.Number) FROM t1
INNER JOIN t2 ON t2.Number = t1.Number
но не работает такой
T-SQL
1
2
3
SELECT COUNT(t1.Number) FROM t1
INNER JOIN t2 ON t2.Number = t1.Number
INNER JOIN t3 ON t3.Number = t1.Number
это нормально?

Добавлено через 2 минуты
*пропущен оператор
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 08:13
Цитата Сообщение от nunnt Посмотреть сообщение
это нормально?
Нет конечно.
Не работает это как? Виснет? Поля-то, кстати, однотипные? Он там сам случаем ничего никуда не конвертит?
0
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 08:16  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
Нет конечно.
Не работает это как? Виснет? Поля-то, кстати, однотипные? Он там сам случаем ничего никуда не конвертит?
да, однотипные, не конвертит, там ошибка, не указал сразу "Ошибка синтаксиса (пропущен оператор) в выражении запроса" это может быть фича access'а?
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 08:19
Лучший ответ Сообщение было отмечено nunnt как решение

Решение

nunnt, чудесный синтаксис Access'a...

Попробуйте так:
SQL
1
2
3
SELECT COUNT(t1.Number) FROM (t1
INNER JOIN t2 ON t2.Number = t1.Number)
INNER JOIN t3 ON t3.Number = t1.Number
1
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 08:43  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
nunnt, чудесный синтаксис Access'a...

Попробуйте так:
SQL
1
2
3
SELECT COUNT(t1.Number) FROM (t1
INNER JOIN t2 ON t2.Number = t1.Number)
INNER JOIN t3 ON t3.Number = t1.Number
Cupko, да, действительно работает и с более сложным запросом тоже, единственное в более сложном запросе надо тоже еще скобок добавить (мб кому понадобится)
SQL
1
2
3
4
SELECT COUNT(t1.NUMBER) FROM (t1
INNER JOIN t2 ON (t2.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы2>))
INNER JOIN t3 ON (t3.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы3>)
WHERE <несколько условий на столбцы>
похоже буду переписывать все запросы через соединение, единственное, он выполняется долго, 8 секунд например + запросов будет около дюжины, есть идеи как это можно ускорить? и другая субд будет работать быстрее?
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 08:55
Цитата Сообщение от nunnt Посмотреть сообщение
и другая субд будет работать быстрее?
возможно, но для высокой скорости недостаточно смены субд, тут и от оптимальности запросов многое что зависит, и от структуры БД, и от железа тоже.

Like - это не очень быстрый оператор, а если вы его ещё используете в нескольких местах, то вполне логично запрос отрабатывается долго. Чем его заменить, я не могу вам сказать, может стоит более тщательно продумать структуру БД.
1
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 09:07  [ТС]
Cupko, ок, спасибо, а последний вопрос, если можно, где мне указать что-то типо "GROUP BY t1.Number"? чтобы он считал число строк с разным значением Number
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 09:26
nunnt,
Думаю, в Access только так:
SQL
1
2
3
4
5
SELECT COUNT(NUMBER) FROM (
SELECT DISTINCT t1.NUMBER FROM (t1
INNER JOIN t2 ON (t2.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы2>))
INNER JOIN t3 ON (t3.NUMBER = t1.NUMBER AND <условие на столбцы из таблицы3>)
WHERE <несколько условий на столбцы>)
1
0 / 0 / 0
Регистрация: 31.07.2014
Сообщений: 21
20.08.2014, 09:39  [ТС]
Cupko, спасибо!

Добавлено через 5 минут
Cupko, ну и некая ирония в том, что с DISTINCT работает мой же начальный запрос без JOIN..
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
20.08.2014, 09:51
Цитата Сообщение от nunnt Посмотреть сообщение
Cupko, ну и некая ирония в том, что с DISTINCT работает мой же начальный запрос без JOIN..
Пересмотрел ещё раз ваш запрос без Join, не могу понять с чем это связано.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2014, 09:51
Помогаю со студенческими работами здесь

Как посмотреть T-SQL запрос который генерирует Entity Framework запрос
как посмотреть T-SQL запрос который генерирует Entity Framework запрос в visual studio 2010, 2012

Запрос Select T-sql - Вложенный запрос вернул больше одного значения
Нужно посчитать комиссию от сделки. DealShare(комиссия) - поле таблицы agents, supplies - предложения(риелторы клиентам) deals-...

Как в sql запрос вставить еще один запрос правильно?
Есть длинный запрос, в котором можете даже не разбираться если не хотите, но выдает он следующее: Запрос: SELECT...

SQL-запрос в SQL server management studio 2008 (if else)
Здравствуйте! Нужна помощь в правке условия, уже как более 8 часов не могу правильно составить условие... +1 к карме обеспечен. Вычислить...

Не работае запрос в SQL Navigator 6.0 хотя работает в 4 и SQL Plus
Добрый день. Такая вот непонятная проблемка нарисовалась на ровном месте. Установили SQL Navigator 6.0 и запрос: select (CASE WHEN...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru