Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 32 33 34 35 36 37 38 39 40 41 42

Открыть новую тему     Написать ответ в эту тему

Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
спасибо за идею!
 
а как программно искать определенную запись в sqlite-файле?  
Как раньше в Delphi можно было:  
   if Table1.Locate('product_name', name_str, []) then
 
 
Только select-ом?

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 09:39 11-12-2020
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare

Цитата:
Только select-ом?

стандартные SQL запросы - это же база данных.

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 09:44 11-12-2020
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, помогите плиз с запросом.
 
Есть такая таблица:
id
name
next_id - ссылается на id следующего товара
 
Нужно найти такие записи, которые содержат такие next_id, значения которых не существуют в таблице для id

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 15:22 16-01-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare
select t1.* from table as t1 left join table as t2 on t1.next_id = t2.id where t2.id is null

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 15:33 16-01-2021
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare
SELECT * FROM TableName
WHERE next_id not IN (SELECT id FROM TableName)
 
TableName - имя вашей таблицы

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 15:33 16-01-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh
Mavrikii
 
спасибо!
 

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 15:42 16-01-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, помогите с запросом, пожалуйста.
 
Та же сама  таблица:
id
name
next_id - ссылается на id следующего товара
 
Нужно найти такие записи, у которых совпадают next_id

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 15:20 18-01-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare

Цитата:
Нужно найти такие записи, у которых совпадают next_id

select *, count(next_id) from table group by next_id having count(next_id) > 1
не проверял.

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 15:24 18-01-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
вы не знаете, почему у меня что ваш запрос  
select t1.* from table as t1 left join table as t2 on t1.next_id = t2.id where t2.id is null
 
что запрос
SELECT * FROM TableName WHERE next_id not IN (SELECT id FROM TableName)  
 
выполняется безумно долго?
 
У меня есть индекс по этим двум полям  (id и next_id)
Или нужно создавать два индекса (по каждому из полей)?

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 16:31 18-01-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare

Цитата:
выполняется безумно долго?

какая бд? данные о таблице?
 

Цитата:
У меня есть индекс по этим двум полям  (id и next_id)

если id уже primary, то нет смысла его добавлять, так как индекс уже его использует.
 
но в общем смысле, при обоих запросах у вас идет перебор всей таблицы.

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 16:35 18-01-2021 | Исправлено: Mavrikii, 16:39 18-01-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
БД - Sqlite, размер 84 Гб
 
Нет, id не праймери, праймери другое поле

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 16:45 18-01-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare

Цитата:
БД - Sqlite, размер 84 Гб

да вы знаете толк в извращениях ))

Цитата:
Или нужно создавать два индекса (по каждому из полей)?

лучше в паре. и лучше выбирать тогда не *, а только id или primary
 
на примере MySQL она использует индекс id, next_id
 
но для моего примера основной запрос Using index, а join получается как Using where; Not exists; Using index
 
для примера с NOT IN получается для основного запроса Using where; Using index, для подзапроса Using where; Using index; Full scan on NULL key
 
как же себя поведет sqlite всецело зависит от используемого вами драйвера для работы с sqlite файлом.

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 16:57 18-01-2021 | Исправлено: Mavrikii, 17:01 18-01-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 

Цитата:
select *, count(next_id) from table group by next_id having count(next_id) > 1
не проверял.

 
что-то не то на выходе получается(

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 18:34 18-01-2021
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare

Цитата:
Ребята, помогите с запросом, пожалуйста.
 
Та же сама  таблица:
id
name
next_id - ссылается на id следующего товара
 
Нужно найти такие записи, у которых совпадают next_id

 
select * from TableName  
where next_id in  
(
SELECT next_id FROM TableName  
GROUP BY next_id
HAVING  COUNT(*) >1
)
order by next_id  
на вашей базе выполняться будет очень долго

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 20:01 18-01-2021 | Исправлено: DrakonHaSh, 20:03 18-01-2021
DenSyo

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Steepe_Hare
 

Цитата:
Ребята, помогите с запросом, пожалуйста.
 
Та же сама  таблица:
id
name
next_id - ссылается на id следующего товара
 
Нужно найти такие записи, у которых совпадают next_id

 

Код:
SELECT DISTINCT [tab1].*  
FROM [my_table] [tab1]  
INNER JOIN [my_table] [tab2] ON [tab2].[next_id]=[tab1].[next_id] AND [tab2].[id]<>[tab1].[id]  

 
так быстрее будет
PS забыл вначале про distinct....

Всего записей: 218 | Зарегистр. 19-01-2008 | Отправлено: 11:03 20-01-2021 | Исправлено: DenSyo, 12:04 20-01-2021
frato

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как удалить из второй таблицы записи, выбранные для удаления в первой таблице?
Видел ответы типа:
DELETE FROM ... WHERE ... IN ( SELECT ...
Delete ... From ... as ...
DELETE ... FROM ... AS ... WHERE EXISTS ( SELECT
 
А можно обойтись без SELECT и AS ?
Пытаюсь сделать как-то так:
delete from table2 where table2.kod=table1.kod and table1.rod=5
Но так не работает, конечно.

Всего записей: 179 | Зарегистр. 28-06-2008 | Отправлено: 11:26 10-05-2021
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вопрос по мне как-то слабо-понятно сформулирован. если я верно понял, то *попробовать* можно так:

Цитата:
delete from table2 where table2.kod=table1.kod and table1.rod=5
=>
Код:
DELETE FROM table2  
FROM table2 LEFT JOIN table1 ON table2.kod=table1.kod  
WHERE table1.rod=5;

 
хотя лично мне по душе такой варик:
Код:
DELETE FROM table2  
where table2.kod in (
select table1.kod from table1
where table1.rod=5
)

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 12:19 10-05-2021 | Исправлено: DrakonHaSh, 17:40 10-05-2021
frato

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
хотя лично мне по душе такой варик:

Второй вариант сработал.
Большое спасибо!
Первый вызвал ошибку, типа "укажите таблицу, в которой нужно удалять".
Но проблема решена вторым вариантом.

Всего записей: 179 | Зарегистр. 28-06-2008 | Отправлено: 15:02 11-05-2021
DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
frato

Цитата:
Первый вызвал ошибку, типа "укажите таблицу, в которой нужно удалять".

а что за СУБД ? в ms sql server работает
 
можете еще так попробовать:

Код:
DELETE FROM t2
FROM table2 t2 LEFT JOIN table1 ON t2.kod=table1.kod  
WHERE table1.rod=5


Код:
DELETE t2
FROM table2 t2 LEFT JOIN table1 ON t2.kod=table1.kod  
WHERE table1.rod=5


Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 16:37 11-05-2021
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DrakonHaSh

Цитата:
можете еще так попробовать

скорее  

Код:
DELETE FROM table2  
LEFT JOIN table1 ON table2.kod=table1.kod  
WHERE table1.rod=5;

два раза FROM явно ошибка.

Всего записей: 15089 | Зарегистр. 20-09-2014 | Отправлено: 23:37 12-05-2021
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 32 33 34 35 36 37 38 39 40 41 42

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » SQL запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru