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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 43

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

mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Да, можно в цикле. Но тут оказалось что моя начальная постановка была неверная и надо заменить значения всех таких параметров независимо от их значения. Как быть в это случае ?
 
Разобрался, решил задачу прямым перебором по индексу.

Всего записей: 4946 | Зарегистр. 05-01-2006 | Отправлено: 09:58 13-04-2022 | Исправлено: mithridat1, 14:44 13-04-2022
zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, имею кучу связанных таблиц. Сделал запрос Select к некоторым из них и в принципе результат почти устраивает, но имеет примерно такой вид:
 

Код:
 
2102                    9    9    (null)    1
2102                    9    9    +34993                       1
2103                    9    9    (null)    1
2103                    9    9    +34993                       1
2104                    9    9    (null)    1
2104                    9    9    +34993                       1
211                     9    9    (null)    1
211                     9    9    +34993                       1
213                     5    5    (null)    3
214                     5    5    (null)    3
215                     5    5    (null)    3
23249                   22    22    (null)    1
23249                   22    22    .....+3492275906             1
 
 

 
Дело в том, что одна из таблиц по умолчанию заполнена строками с значениями NULL, потом в неё может добавиться запись, а может не добавляться.
В результирующем запросе я бы не хотел видеть строки с NULL , если были добавлены другие значения, и в то же время , если ничего не добавлялось, то я хотел бы увидеть дефолтные строки с NULL. Или другими словами исключить из выборки в примере строки 1,3,5,7,12 и оставить строки 9,10,11. Возможно такое реализовать?

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 09:41 26-07-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zumicator
ну я же написал, добавьте доп запрос.
SELECT что_нужно FROM table1
JOIN (SELECT column1, count(column1) total FROM table2 GROUP BY column1) as CNT ON CNT.column1 = table1.column1  
JOIN ...
JOIN ...
JOIN ...
WHERE (CNT.total > 1 AND table2.column2 IS NOT NULL) OR CNT.total = 1
 
как то так, не обещаю что заработает сразу.. если бы сбросили дамп, было бы конкретнее.

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 09:58 26-07-2022
zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, идею понял, реализовать пока не получается.  Отбросил пока все таблицы, пробую с одной, где встречаются NULL.

Код:
 
SELECT routeid, COUNT (routeid) total FROM out_called_conv  
GROUP BY routeid
 

Выдаёт количество строк по полю:  

Код:
 
routeid    total
2              2
5              1
13              2
19              1
1              2
10              1
15              2
 

 
Как только добавляю HAVING или WHERE по total , [Code: -217, SQL State: IX000]  Column (total) not found in any table in the query (or SLV is undefined).
 
Попробовал смоделировать тут  http://sqlfiddle.com/#!9/ada43b/2/0 - всё работает.
Выходит, что моя СУБД(informix 9.40) достаточно древняя и не умеет так?

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 11:16 26-07-2022 | Исправлено: zumicator, 14:52 26-07-2022
vikkiv



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

Цитата:
Как только добавляю HAVING или WHERE по tota

например на диалекте SQL Server надо принимать во внимание порядок обработки/выполнения кода интерпретатором (select/from/where/... и т.д.)
внешние/конечные алиасы присваиваются после остальных обработок
т.е. у тебя в having/where получается обращение к не существующему на тот момент объекту под названием [total] (т.к. он создаётся после)
нужно обращаться к объекту с названием [routeid]
типа:
select ... from ... group by... having count([routeid])...
 
 
можно конечно делать условия и по полю [total] - но придётся немного преобразовать конструкцию кода переделав на подзапросы
(чтобы на внешнюю команду поступало [total] из внутренней)
типа:
select ... from (select ... , as [total] group by...) as x where [total]>...
 
Mavrikii выше уже намекал на подобную конструкцию (используя подзапрос в join)

Всего записей: 747 | Зарегистр. 10-11-2005 | Отправлено: 15:13 26-07-2022 | Исправлено: vikkiv, 15:18 26-07-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
zumicator
https://www.ibm.com/docs/en/informix-servers/12.10?topic=clauses-having-clause
 

Цитата:
моя СУБД(informix 9.40) достаточно древняя и не умеет так?

https://www.oninit.com/manual/informix/940/ct1sqna_ct1srna.pdf
есть там..

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 23:02 26-07-2022
zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, спасибо за ссылки. Синтаксис HAVING без использования алиасов подсмотрел там.  
Увы не получается освоить подзапросы с внутренним COUNT.
Например такие запросы по отдельности что то выводят:

Код:
 
SELECT DISTINCT route.routeid, out_called_conv.dicon, trunk_group.trnkgrpid FROM route  
JOIN trunk_group ON trunk_group.trnkgrpid = route.trnkgrpid
JOIN out_called_conv ON out_called_conv.routeid = route.routeid
WHERE out_called_conv.routeid IN (SELECT routeid FROM out_called_conv GROUP BY routeid)  
 


Код:
 
SELECT routeid, COUNT(*) FROM out_called_conv WHERE exchid ='3422' GROUP BY routeid;
 

Но не во вложенном виде.
Очевидно, мне азы подтянуть надо.

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 08:56 28-07-2022
Mavrikii

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

Цитата:
Но не во вложенном виде.

не знаю, как в вашей версии SQL, но у вложенного должен быть алиас для обращения.
и потом результат подсчета используется вне этого запроса.  
 
 

Цитата:
SELECT routeid, COUNT(*) FROM out_called_conv WHERE exchid ='3422' GROUP BY routeid;

вы это в IN запихнули? там должен быть только один столбец тогда.
уверены, что вариант какой я предоставил, не работает?  
 
SELECT DISTINCT route.routeid, out_called_conv.dicon, trunk_group.trnkgrpid FROM route  
JOIN trunk_group ON trunk_group.trnkgrpid = route.trnkgrpid
JOIN out_called_conv ON out_called_conv.routeid = route.routeid
JOIN (SELECT routeid, COUNT(*) ttl FROM out_called_conv WHERE exchid ='3422' GROUP BY routeid) table1 ON table1.routeid = out_called_conv.routeid
WHERE table1.ttl > 1
 
условие внизу так, для примера..

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 09:08 28-07-2022
zumicator

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

Цитата:
вы это в IN запихнули? там должен быть только один столбец тогда.  

Да, там вылезает ошибка прямо об этом намекающая, пробовал по-разному, но без алиасов 1 столбец не придумал

Цитата:
уверены, что вариант какой я предоставил, не работает?  

Вот сейчас попробовал Ваш код, который ниже был, получаю [Code: -201, SQL State: 42000]  A syntax error has occurred.
Как писал выше vikkiv, возможно дело в порядке обработки/назначения алиасов в моей версии.
Этот же код работает здесь http://sqlfiddle.com/#!9/4389ff/1/0 почти для всех представленных вариантов SQL
 

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 09:31 28-07-2022 | Исправлено: zumicator, 10:38 28-07-2022
zumicator

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Итог - получился запрос без JOIN и без алиасов, в условия к которому добавил такую плохочитаемую конструкцию

Код:
 
WHERE ...
AND...
AND...
AND
(
(
out_called_conv.routeid IN (SELECT routeid FROM out_called_conv WHERE exchid ='3107' GROUP BY routeid HAVING COUNT(*) > 1)  
AND dicon IS NOT NULL
)  
OR out_called_conv.routeid IN (SELECT routeid FROM out_called_conv WHERE exchid ='3107' GROUP BY routeid HAVING COUNT(*) = 1)
)
 

Работает, но количество скобок, оставляет желать, да и работает не правильно.

Всего записей: 12 | Зарегистр. 05-12-2009 | Отправлено: 07:19 02-08-2022 | Исправлено: zumicator, 10:06 02-11-2022
Molodetsss

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ребята, помогите с запросом пожалуйста.
Есть таблица с полями:
Player1, Player2
 
Например:
Карпов, Корчной
Корчной, Каспаров
Крамник, Ананд
Крамник, Карлсен
 
Как вывести игроков и количество партий, в которых он участвовал
Например:
Корчной, 2
Крамник, 2
Карпов, 1
и т.д.

Всего записей: 136 | Зарегистр. 24-04-2022 | Отправлено: 12:08 01-09-2022
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну для sql server в лоб будет нечно подобное
 
select g.player, count(*)
from (
select player1 as player from games
union
select player2 as player from games
) g
group by g.player
 
писал сразу в форуме без проверки

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 14:29 01-09-2022 | Исправлено: andyzubov, 14:31 01-09-2022
Molodetsss

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andyzubov
 
Что-то не то получается...
 
У всех по 1 игре и почему-то дублируются

Всего записей: 136 | Зарегистр. 24-04-2022 | Отправлено: 18:54 01-09-2022
andyzubov

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
CREATE TABLE #test (player1 nvarchar(50), player2 nvarchar(50))
 
insert into #test (player1, player2) values (N'Каспаров', N'Карпов')
insert into #test (player1, player2) values (N'Карпов', N'Алехин')
 
select player, count(*) as games  
from (
select player1 as player from #test
union all
select player2 from #test
) g
group by player
 
DROP TABLE #test

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 20:29 01-09-2022
Mavrikii

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

Цитата:
У всех по 1 игре и почему-то дублируются

играйтесь http://sqlfiddle.com/#!9/3f83ee3/2

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 00:37 02-09-2022
Molodetsss

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andyzubov
Mavrikii
 
ребята, вы круты!
Только я не понял, почему в одном случае "select player1 as player from", а во втором просто "select player2 from"

Всего записей: 136 | Зарегистр. 24-04-2022 | Отправлено: 07:52 02-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Molodetsss
потому что первое уже дает алиас столбцу.
 

Цитата:
ребята, вы круты!

я лишь подогнал вариант andyzubov для MySQL

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 07:56 02-09-2022
Fenrizz



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
select distinct player1, (select count(*) from players p1 where p1.player1=players.player1 or p1.player2=players.player1) from players
UNION
select distinct player2, (select count(*) from players p1 where p1.player1=players.player2 or p1.player2=players.player2) from players;
 
Mavrikii
Добавил

Всего записей: 677 | Зарегистр. 12-09-2017 | Отправлено: 07:58 02-09-2022 | Исправлено: Fenrizz, 08:07 02-09-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Fenrizz
а что делать с теми, кого нет в player1?
 

Цитата:
Добавил

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

Всего записей: 15112 | Зарегистр. 20-09-2014 | Отправлено: 08:02 02-09-2022 | Исправлено: Mavrikii, 08:11 02-09-2022
andyzubov

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

Цитата:
ребята, вы круты!
Только я не понял, почему в одном случае "select player1 as player from", а во втором просто "select player2 from"

 
парсеру надо знать как будет называться колонка в запросе возвращаемом под алиасом "g". Вот в первой части запроса я и сказал что хочу чтобы колонка называлась player, во втором запросе уже можно не указывать.

Всего записей: 493 | Зарегистр. 02-04-2015 | Отправлено: 08:48 02-09-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 43

Компьютерный форум 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