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

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

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

DrakonHaSh



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
да, похоже это фича чисто Transact-SQL, а не стандарта SQL
https://docs.microsoft.com/en-us/sql/t-sql/statements/delete-transact-sql?view=sql-server-2017
Цитата:
FROM table_source
Specifies an additional FROM clause. This Transact-SQL extension to DELETE allows specifying data from <table_source> and deleting the corresponding rows from the table in the first FROM clause.
 
This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.
тут еще можно почитать, если есть желание:  
https://stackoverflow.com/questions/56453021/sql-server-delete-from-table-from-table
http://www.sql-tutorial.ru/ru/book_delete_statement.html

Всего записей: 2076 | Зарегистр. 08-01-2008 | Отправлено: 09:37 13-05-2021 | Исправлено: DrakonHaSh, 09:39 13-05-2021
destiny child



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

Всего записей: 3275 | Зарегистр. 01-04-2006 | Отправлено: 18:04 21-05-2021 | Исправлено: destiny child, 10:39 22-05-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, помогите пожалуйста сформировать запрос, чтобы получить "Сергей Семак против Спартака"  
 
Есть таблица clubs
id, name
 
Есть таблица players
id, name
 
Есть таблица coaches
id, name
 
Есть таблица игр games
id
id_home_team
id_guest_team
id_result (1 - победа хозяев, 0 - ничья, - 1 - победа гостей)
 
Таблица участников participants
id
id_game
id_player
id_coach
 
Какой счет у:
1. Сергея Семака против Спартака (как игрока). Играл в нескольких клубах против Спартака
2. Сергея Семака против Спартака (как тренера). Был тренером нескольких клубов против Спартака
 
Голову сломал уже, как написать запросы

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

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

Цитата:
Таблица участников participants
id
id_game
id_player
id_coach

не совсем удобный формат.. потому что либо id_coach будет пустым почти везде, либо..
проще, возможно, добавить enum поле указывающее кто это - игрок или тренер.
по этой же причине нет смысла заводить отдельную таблицу coaches

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 23:29 22-05-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
да, наверное, так лучше.
 
Получается:
 
Есть таблица clubs
id, name
 
Есть таблица players/coaches
id, name
 
Есть таблица игр games
id
id_home_team
id_guest_team
id_result (1 - победа хозяев, 0 - ничья, - 1 - победа гостей)
 
Таблица участников participants
id
id_game
id_player
id_type (0 - игрок, 1 - тренер)

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 00:04 23-05-2021
Mavrikii

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

Код:
SELECT COUNT(g.id_result) FROM players p
JOIN participants pt ON (pt.id_player = p.id AND pt.type = 'player')
JOIN games g ON pt.id_game = g.id
JOIN clubs c ON ((c.id = g.id_home_team AND g.id_result = 1) OR (c.id = g.id_guest_team AND g.id_result = -1))
WHERE p.name = 'Semak' AND c.name = 'Spartak'

 
нужен тренер  - другой pt.type
 
нужно правильно создать индексы и посмотреть скорость выполения на больших данных
 
ps: проверьте значения результата когда и какая команда выигрывает в clubs ON

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:07 24-05-2021 | Исправлено: Mavrikii, 09:22 24-05-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
всегда поражаюсь, как люди не ломают голову при построении таких запросов. Спасибо, буду пробовать

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 06:55 25-05-2021
Alexzzy

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем привет.
MS SQL Server 2017.
Из строки надо вырезать часть строки с вариативной серединкой (количество процентов). Какие могут быть варианты?
Имеем, например, следующую строку 'какое-то начало вырезаем 55% из этой строки кокой-то конец'
Т.е. надо вырезать строку в которой число 55 может быть произвольным 'вырезаем 55% из этой строки' и в результате получить строку 'какое-то начало  кокой-то конец'.

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 15:38 27-07-2021
Alexzzy

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

Код:
 
declare
   @s1 varchar(1024) = 'вырезаем '
  ,@s2 varchar(1024) = '% из этой строки'
 
select
  replace( stuff( t.Notes
                 ,charindex(@s2, t.Notes) - charindex(reverse(@s1), reverse(substring(t.Notes, 1, charindex(@s2, t.Notes) - 2)))
                 ,charindex(reverse(@s1), reverse(substring(t.Notes, 1, charindex(@s2, t.Notes) - 2)))
                 ,''
                )
          ,@s1 + @s2
          ,''
         )
from (select 'какое-то начало вырезаем 55% из этой строки кокой-то конец' as Notes
      union all  
      select 'тест вырезаем 33.11% из этой строки конец теста' as Notes) as t
 

Всего записей: 1474 | Зарегистр. 10-07-2013 | Отправлено: 19:47 27-07-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, помогите пожалуйста с SQL-запросом.
 
Есть только одна табличка:
home_id INTEGER
away_id INTEGER
result INTEGER,  
Где home_id - хозяева (команда)
away_id - гости,
result - результат (1 - победа хозяев, 0 - ничья, -1 - победа гостей)
 
Допустим, такие результаты встреч:
1   2      1
2   1     -1
3   1     -1
1   3      0
2   3      1
3   2      1
 
Как сформировать запрос, чтобы получить таблицу команд по количеству побед:
 
1    3 (то есть команда 1 одержала 3 победы)
2    1
3    1

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

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

Код:
SELECT x.id, SUM(x.res) FROM (
SELECT home_id id, SUM(result) res FROM results WHERE result > 0 GROUP BY home_id
UNION
SELECT away_id id, ABS(SUM(result)) res FROM results WHERE result < 0 GROUP BY away_id
) x GROUP BY x.id

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 20:40 07-09-2021 | Исправлено: Mavrikii, 20:43 07-09-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
Спасибо!
ваш запрос хорошо сработал для 6 записей, которые я привел.
 
Но стоило добавить еще две:
4 1     1
1 4     1
 
И странный результат:
1    2
2    1
3    1
4    1
 
Хотя должно быть:
1    4
2    1
3    1
4    1
 
То есть поражение не должно уменьшать количество побед

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 23:30 07-09-2021 | Исправлено: Steepe_Hare, 23:31 07-09-2021
Mavrikii

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

Цитата:
То есть поражение не должно уменьшать количество побед

тогда так.. UNION удаляет дубликаты, забыл об этом.
и нужно считать, а не суммировать.

Код:
SELECT x.id, SUM(x.res) FROM (
SELECT home_id id, COUNT(*) res FROM results WHERE result > 0 GROUP BY home_id
UNION ALL
SELECT away_id id, COUNT(*) res FROM results WHERE result < 0 GROUP BY away_id
) x GROUP BY x.id

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 05:05 08-09-2021 | Исправлено: Mavrikii, 05:05 08-09-2021
Steepe_Hare



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

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 10:39 08-09-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не совсем SQL-запрос, но очень близко к теме.
 
Есть у меня SQlite-файл, в котором таблица вида:
 
CREATE TABLE IF NOT EXISTS quiz (id INTEGER PRIMARY KEY AUTOINCREMENT,  
question VARCHAR(100), answerindex INTEGER)
 
 
При большом количестве записей (100 тыс.) поиск по полю id довольно медленный.
Странно, ведь поле id - первичный ключ. Оно не индексируется что ли?
 
Какое решение вы бы предложили?
 
 
Добавлено:
Или как организовать запрос таким образом, чтобы он за раз вытянул 100 случайных (разных) вопросов из quiz ?
И желательно быстро

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 09:58 02-12-2021
Steepe_Hare



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Господа, помогите пожалуйста сформировать запрос для такой ситуации.
 
Есть большая таблицы с результатами игр
Поля: Home Away Res, где Res - результат (1 - победа хозяев, 0 - ничья, -1 - победа гостей)
 
Пример:
Спартак- Зенит 0
Зенит- ЦСКА 1
Зенит- Спартак 1
Зенит- Спартак 1
Динамо- Зенит 1
 
Как сформировать статистику личных встреч по определенной команде?
Допустим, по Зениту:
Спартак  2-1-0
ЦСКА  1-0-0
Динамо 0-0-1

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 06:43 10-01-2022
Mavrikii

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

Цитата:
чтобы он за раз вытянул 100 случайных (разных) вопросов из quiz ?

если id непрерывный - заранее сгенерить 100 случайных и их выбрать.
если могут быть разрывы -  
SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT 100)
 

Цитата:
Поля: Home Away Res, где Res - результат (1 - победа хозяев, 0 - ничья, -1 - победа гостей)

проще для подсчетов сделать 3 столбца
 

Цитата:
Как сформировать статистику личных встреч по определенной команде?

надеюсь, что храните названия отдельно и указываете id записи клуба.
 
select r.com, sum(r.wins), sum(r.draws), sum(r.defeats) from (
select away as com, sum(res * (res + 1))/2 as defeats, -sum((res + 1) * (res - 1)) as draws, -sum(res * (res - 1))/2 as wins from tablename where home = id_команды group by away
union all
select home as com, sum(res * (res + 1))/2 as wins, -sum((res + 1) * (res - 1)) as draws, -sum(res * (res - 1))/2 as defeats from tablename where away = id_команды group by home
) r group by r.com
 
не проверял
 
ps: изменил command на com - вдруг ключевое слово

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 08:04 10-01-2022 | Исправлено: Mavrikii, 11:11 10-01-2022
Steepe_Hare



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

Всего записей: 1162 | Зарегистр. 27-10-2001 | Отправлено: 05:05 11-01-2022
mithridat1



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вопрос по T-SQL, если тут есть спецы по нему.
 
Мне нужно изменить данные в столбце с типом данные xml.  
Делаю так
 
UPDATE table1
SET serverconf.modify('replace value of (/Conf/Params/ipaddr/@value[.="192.168.0.1"])[1] with "192.168.0.2"')
 
Проблема в том что параметр, который необходимо изменить, может встречаться в конфиге произвольное количество раз, а этот запрос меняет только первое попавшееся значение, удовлетворяющее условию. Как заменить все значения параметра ?

Всего записей: 4924 | Зарегистр. 05-01-2006 | Отправлено: 00:35 13-04-2022 | Исправлено: mithridat1, 01:07 13-04-2022
Mavrikii

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

Цитата:
Как заменить все значения параметра ?

в цикле, пока таких не найдется?
https://social.technet.microsoft.com/wiki/contents/articles/28601.t-sql-tips-search-and-replace-string-from-multiple-nodes-within-a-xml-document.aspx

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 01:50 13-04-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

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