Бред

Ответить в тред Ответить в тред
Аноним # OP 28/12/20 Пнд 22:47:29 2364369621
image.png 21Кб, 820x227
820x227
image.png 6Кб, 559x100
559x100
image.png 21Кб, 894x212
894x212
Сап /б/, срочно нужна помощь с sql запросом.
Имеется бд из трех табличек - пик 1
Формулировка задачи - пик 2
Мое решение - пик 3, но оно нихуя не работает, знаю одно что запрос должен быть написан с двумя not exist'aми
В таблице work_area_dict:
num - номер цеха
area_num - номер участка
В таблице persons:
work_num - номер цеха
area_num - номер участка
Буду рад любой помощи
Аноним 28/12/20 Пнд 22:48:25 2364370342
бамп
Аноним 28/12/20 Пнд 22:49:02 2364370753
бамп
Аноним 28/12/20 Пнд 22:49:51 2364371344
бамп
Аноним 28/12/20 Пнд 22:50:40 2364371965
бамп
Аноним 28/12/20 Пнд 22:51:38 2364372646
бамп
Аноним 28/12/20 Пнд 22:53:01 2364373837
бамп
Аноним 28/12/20 Пнд 22:54:27 2364374828
бамп
Аноним 28/12/20 Пнд 22:55:04 2364375399
Not exists заменить на exists
Вложенность двух exists не нужна, второй вытащить
<4 без not поменяет знак
Аноним 28/12/20 Пнд 23:00:35 23643791810
>>236437539
не понял, второй нот екзист убрать а третий селект тогда куда?
Аноним 28/12/20 Пнд 23:00:55 23643793611
select * from profession pr
join persons ps on ps.prof_code = pr.code
join work_area wa on wa.area_num = ps.area_num
where
ps.category>4
and wa.num = 7
Аноним 28/12/20 Пнд 23:00:59 23643794412
>>236436962 (OP)
Какая-то у тебя херня с num = 7.
Кажется, должно быть что-то другое - place_num например
Аноним 28/12/20 Пнд 23:03:40 23643814013
>>236437936
вот этого поддвачну, нахуй тут вообще было какие-то подзапросы хуевертить? В самом условии прям SQL имеется, выбрать всех гречневых из 7 участка с разрядом > 4
Аноним 28/12/20 Пнд 23:05:01 23643823814
>>236437936
Хуйня же. Сказано же "все рабочие этой прфессии"
Аноним 28/12/20 Пнд 23:07:36 23643842815
image.png 42Кб, 1023x399
1023x399
image.png 11Кб, 701x135
701x135
image.png 11Кб, 705x137
705x137
>>236437936
смотри, неправильно работает. на 7ом цехе два участка, он должен был вывести только токаря водителя и электрика
Аноним 28/12/20 Пнд 23:09:15 23643852716
>>236438238
вот, я про тоже, как это реализовать ? почему в оп посте запрос мой не работает?
Аноним 28/12/20 Пнд 23:10:42 23643864117
бамп
Аноним 28/12/20 Пнд 23:12:16 23643875918
бамп
Аноним 28/12/20 Пнд 23:13:12 23643883519
бамп
Аноним 28/12/20 Пнд 23:14:13 23643889720
бамп
Аноним 28/12/20 Пнд 23:15:31 23643899821
бамп
Аноним 28/12/20 Пнд 23:16:45 23643908622
Что за программа для моделирования БД?
Аноним 28/12/20 Пнд 23:16:48 23643908923
бамп
Аноним 28/12/20 Пнд 23:19:14 23643923124
>>236439086
это в visual studio датасет можно собрать
Аноним 28/12/20 Пнд 23:19:59 23643928625
>>236436962 (OP)
```
SELECT prof_code
FROM (
SELECT prof_code, area_num
FROM persons
GROUP BY prof_code, area_num
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
) AS good_professions
INNER JOIN work_area_dict
ON work_area_dict.area_num = good_professions.area_num
WHERE work_area_dict.num = 7
```
Аноним 28/12/20 Пнд 23:21:55 23643942826
>>236439286
Спасибо, но тоже не то выводит. С нот экзистами как решить идей нету ?
Аноним 28/12/20 Пнд 23:24:14 23643958827
бамп
Аноним 28/12/20 Пнд 23:24:46 23643963728
>>236439428
А что именно не то?
Что выводит внутренний запрос?

SELECT prof_code, area_num
FROM persons
GROUP BY prof_code, area_num
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
Аноним 28/12/20 Пнд 23:26:03 23643972129
>>236439428
>С нот экзистами как решить идей нету ?
Ну, заменить
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
на NOT EXIST с подзапросом...
Аноним 28/12/20 Пнд 23:27:56 23643984030
image.png 21Кб, 542x340
542x340
image.png 11Кб, 702x137
702x137
image.png 11Кб, 703x137
703x137
>>236439637
103 и 100, это кода водителя и сварщика, должно было вывести токаря, сварщика и водителя
Аноним 28/12/20 Пнд 23:28:59 23643992331
>>236439721
можешь показать как заменить ?
Аноним 28/12/20 Пнд 23:32:05 23644013032
бамп
Аноним 28/12/20 Пнд 23:34:04 23644025933
бамп
Аноним 28/12/20 Пнд 23:37:15 23644046534
бмап
Аноним 28/12/20 Пнд 23:38:45 23644057735
бамп
Аноним 28/12/20 Пнд 23:40:24 23644070336
бамп
Аноним 28/12/20 Пнд 23:41:46 23644079237
image.png 57Кб, 1150x530
1150x530
>>236439840

У меня внутренний запрос пашет нормально:

Аноним 28/12/20 Пнд 23:47:48 23644117238
image.png 86Кб, 1151x821
1151x821
>>236440792
Да и полный запрос пашет:
Аноним 28/12/20 Пнд 23:57:18 23644177139
>>236441172
Попробовал в MS SQL - пашет

CREATE TABLE work_area_dict
(num integer, area_num integer)
;
INSERT INTO work_area_dict
(num, area_num)
VALUES
(7, 1000),
(7, 1001),
(8, 1002)
;

CREATE TABLE persons
(id integer, name varchar(100), prof_code integer, area_num integer, category integer)
;
INSERT INTO persons
(id, name, prof_code, area_num, category)
VALUES
(1, 'Person 1', 100, 1000, 1),
(2, 'Person 2', 100, 1000, 5),
(3, 'Person 3', 101, 1000, 5),
(4, 'Person 4', 101, 1001, 1),
(5, 'Person 5', 102, 1002, 5)
;


SELECT prof_code
FROM (
SELECT prof_code, area_num
FROM persons
GROUP BY prof_code, area_num
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
) AS good_professions
INNER JOIN work_area_dict ON work_area_dict.area_num = good_professions.area_num
WHERE work_area_dict.num = 7
;
Аноним 28/12/20 Пнд 23:59:50 23644192640
Аноним 29/12/20 Втр 00:01:25 23644202841
>>236441771
у тебя таблица persons только с участками же, без цехов
Аноним 29/12/20 Втр 00:03:10 23644209542
А, там >4, не вижу уже нихрена, тогда вот там аноны ниже правильно пишут, что сначала вообще всех отобрать на >4 через having count, потом оставить только 7 цех, всё

мимо уже засыпающий sql-кодер
Аноним 29/12/20 Втр 00:05:23 23644225043
image.png 23Кб, 993x220
993x220
>>236442095
sql-кодер, что исправить в этом запросе чтоб он работал правильно?
Аноним 29/12/20 Втр 00:08:31 23644245444
>>236441771
ты ебанулся? Ты еще WITH заебень и пару окошек. У ОПа задача для даунов, нахуй ты его тролишь
Аноним 29/12/20 Втр 00:08:37 23644246245
>>236442028
>у тебя таблица persons только с участками же, без цехов

Мля. Тогда нехер вообще work_area_dict?
Какое-то оно у тебя всё денормализовано. Информация дублирована.

Но тогда ещё проще.

CREATE TABLE persons
(id integer, name varchar(100), prof_code integer, work_num integer, area_num integer, category integer)
;
INSERT INTO persons
(id, name, prof_code, work_num, area_num, category)
VALUES
(1, 'Person 1', 100, 7, 1000, 1),
(2, 'Person 2', 100, 7, 1000, 5),
(3, 'Person 3', 101, 7, 1000, 5),
(4, 'Person 4', 101, 7, 1001, 1),
(5, 'Person 5', 102, 8, 1002, 5)
;

SELECT DISTINCT(prof_code)
FROM persons
WHERE work_num = 7
GROUP BY prof_code, area_num
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
;


Аноним 29/12/20 Втр 00:09:04 23644249546
Аноним 29/12/20 Втр 00:10:43 23644258947
>>236442454
>Ты еще WITH заебень и пару окошек. У ОПа задача для даунов, нахуй ты его тролишь

Почему ты считаешь, что HAVING COUNT сложнее, чем подзапросы с WHERE NOT EXISTS?
Аноним 29/12/20 Втр 00:12:04 23644267348
>>236442589
я считаю, что делать запрос из запроса это сродни ебли в жопу, даже для замечательного оптимизатора MS SQL
Аноним 29/12/20 Втр 00:12:49 23644272549
>>236442462
Это работает, спасибо, но нужно чтоб запрос был с экзистами или нот экзистами, можешь помочь ?
Аноним 29/12/20 Втр 00:15:15 23644287750
>>236442589
и да, твой count переберет всю таблицу, а not exists скорее всего чекнет индекс и будет иметь сложность lg или даже (1)
Аноним 29/12/20 Втр 00:17:10 23644298951
>>236442250
Тебе написали выше, чтобы ты c not exist поменял на exist. Да и нахуя тебе прям через ебучие экзисты надо? Тебе выше всё готовое выложили, без выебонов.
И вообще чтобы понимать сходу как это работает, надо года 3 отхуячить запросником.
Аноним 29/12/20 Втр 00:19:11 23644311052
Эксисты заебись использовать, например, когда тебе надо из одной выборки убрать/оставить что-то из другой выборки. Всё. Для всего остального есть другие команды.

мимо sql=кодер, пошёл смотреть документалку про Вьентам и баиньки
Аноним 29/12/20 Втр 00:21:27 23644324853
>>236442989
да бля, это хуйню по методичке нужно делать, и препод сказал тип через not exist надо решать, и я честно не понял нихуя как мой запрос исправить, чтоб он работал. Если просто not exist на exist менять, нихуя не работает
Аноним 29/12/20 Втр 00:22:45 23644332054
image.png 206Кб, 1665x1105
1665x1105
>>236442673
>я считаю, что делать запрос из запроса это сродни ебли в жопу, даже для замечательного оптимизатора MS SQL

Так это вы с ОПом предлагаете подзапросы вместо нормальной аггрегации.

Что может быть проще аггрегации?


Аноним 29/12/20 Втр 00:24:43 23644340755
>>236442725
>Это работает, спасибо, но нужно чтоб запрос был с экзистами или нот экзистами, можешь помочь ?

Нахуй.
Я не вижу в тебе воли к жизни.
Я эту хуйню нагуглил за 5 минут, хотя никогда не юзал.
Не буду комить слабого тролля.
Аноним 29/12/20 Втр 00:25:48 23644348856
>>236443320
Вот и я не ебу, скажи преподу Оп, что он лох.
Как минимум потому, что задача с условием типа >4 в sql в подавляющем большинтсве случаев решается через агрегацию и having
Аноним 29/12/20 Втр 00:26:02 23644350157
>>236443320
я написал выше, чем она мне не нравится. Тем, что она обязана перебрать все записи. Exists сходит в индекс и узнает, есть ли ХОТЬ ОДИН. А с агрегацией ты можешь собрать из 10000 гречневых выборку ради того, чтобы узнать, что среди них двачер 3 разряда на вал мотается.
Аноним 29/12/20 Втр 00:26:40 23644354458
>>236443488
да я в рот его ебал, мне надо эту хуйню сдать и забыть
Аноним 29/12/20 Втр 00:27:16 23644358359
>>236443407
ну ты мне скажи что здесь исправить, чтоб правильно было? я первый нот экзист заменил
Аноним 29/12/20 Втр 00:27:25 23644359160
>>236442877
>и да, твой count переберет всю таблицу, а not exists скорее всего чекнет индекс и будет иметь сложность lg или даже (1)

Какой нахер индекс? Индекс по подзапросу? Не удивлюсь, если он будет вызывать этот подзапрос на каждую строку ебучей таблицы и устроит тебе квадратичную сложность.
Аноним 29/12/20 Втр 00:27:51 23644362461
image.png 23Кб, 999x214
999x214
Аноним 29/12/20 Втр 00:34:14 23644401862
изображение.png 43Кб, 1081x798
1081x798
>>236443591
Вот такой. У тебя есть таблица с профессиями, тебе для нее надо запустить ТРИ подзапроса для трёх профессий.
Аноним 29/12/20 Втр 00:35:17 23644407263
>>236444018
и если у тебя есть индекс в personах, который include твой prof_code это будет сука ТРИ строки
Аноним 29/12/20 Втр 00:35:27 23644408164
>>236443501
>я написал выше, чем она мне не нравится. Тем, что она обязана перебрать все записи. Exists сходит в индекс и узнает, есть ли ХОТЬ ОДИН. А с агрегацией ты можешь собрать из 10000 гречневых выборку ради того, чтобы узнать, что среди них двачер 3 разряда на вал мотается.

Ну, перебрать все записи людей из 7го цеха ей имхо и так и так придётся.

С аггрегацией будет так:

Отфильтровать work_num = 7
Отсортировать по prof_num, area_num
Пройти и для каждого prof_num, area_num саггрегировать COUNT(category <= 4). Выкинуть, если COUNT > 0
Пропустить дубликаты prof_num

Без индекса будет N*log(N)
С индексом - N
Аноним 29/12/20 Втр 00:39:42 23644432865
>>236444081
ну я не спорю, что тут пизданутая конструкция, но нелюбовь к поздапросам она откуда-то у людей берется, я не ебу откуда, хотя они часто значительно быстрее, чем неявное создание промежуточных таблиц внутри подзапроса с агрегатами, и тем более при бесконтрольном джойне такой выборки на другие таблицы.
Аноним 29/12/20 Втр 00:40:16 23644435266
Аноним 29/12/20 Втр 00:40:43 23644437967
>>2364440
не то выводит запрос
Аноним 29/12/20 Втр 00:42:17 23644445668
Аноним 29/12/20 Втр 00:43:25 23644451669
>>236444328
>но нелюбовь к поздапросам она откуда-то у людей берется, я не ебу откуда

Мы, может, юзаем разные термины, но разве то, что внутри EXISTЫ(...) - это не классический подзапрос?

В отличие от предиката внутри COUNT, который является простым выражением, а не подзапросом?
Аноним 29/12/20 Втр 00:48:26 23644478270
>>236444018

Кстати, а что оно у тебя показывает на

SELECT DISTINCT(prof_code)
FROM persons
WHERE work_num = 7
GROUP BY prof_code, area_num
HAVING COUNT(CASE WHEN category <= 4 THEN 1 END) = 0
;
Аноним 29/12/20 Втр 00:48:32 23644478771
>>236444516
Классический подзапрос может помочь запросу отработать быстрее просто за счет того, что в одну тычку уберёт часть верхнего множества. Ну если доводить до абсурда - можно поискать в одной таблице наличие записи в поле с индексом (через exists), а можно сделать count(*) по этому полю с условием where

типа select 1 where exists(select 1 from ttt where id = 99123)
Аноним 29/12/20 Втр 00:49:32 23644484472
>>236444782
таблицы не находит и поля)
Аноним 29/12/20 Втр 00:50:15 23644488273
>>236444787
против select 1 from ttt where id = 99123 group by id having count(*) > 0
Аноним 29/12/20 Втр 00:51:14 23644492374
Ох уж эти ебанутые запросы из нескольких таблиц с условиями. Последние несколько лет только и делаю, что пишу вместо них кучу простых запросов и расставляю нормально индексы. Увеличение скорости работы в тысячи раз.
Аноним 29/12/20 Втр 00:51:26 23644493675
>>236444844
Таблица те же ведь - persons.

А поля - как у опа, вроде

CREATE TABLE persons
(id integer, name varchar(100), prof_code integer, work_num integer, area_num integer, category integer)
;
INSERT INTO persons
(id, name, prof_code, work_num, area_num, category)
VALUES
(1, 'Person 1', 100, 7, 1000, 1),
(2, 'Person 2', 100, 7, 1000, 5),
(3, 'Person 3', 101, 7, 1000, 5),
(4, 'Person 4', 101, 7, 1001, 1),
(5, 'Person 5', 102, 8, 1002, 5)
;
Аноним 29/12/20 Втр 00:51:33 23644494176
>>236444782
Ребята, ну как это на нот экзисты переписать ? Помогите, пожалуйста
Аноним 29/12/20 Втр 00:52:42 23644501077
image.png 31Кб, 548x278
548x278
c помощью ms access надо такое сделать
это сложно/долго? посплю буду делать, впервые сталкиваюсь с базами данных, шансы есть сделать?
Аноним 29/12/20 Втр 00:52:58 23644502678
Просто жойнишь нужные таблицы и добавляешь необходимое условие. Очевидно же.
Аноним 29/12/20 Втр 00:55:07 23644518379
>>236444941
не пропускает детский утренник, а так я выше написал на екзистах, смотри картинку

>>236444018
Аноним 29/12/20 Втр 00:56:11 23644525780
>>236444882
>типа select 1 where exists(select 1 from ttt where id = 99123)
>против select 1 from ttt where id = 99123 group by id having count() > 0

Так один хер же будет, не?

Сначала отфильтруется по id = 99123.
Потом для этой одной строки "посчитается" count(
) и т.д.

ИМХО, подзапросы намного мощнее и с ними проще накосячить, тогда как аггрегатные выражения намного проще и ограниченней. Ты там можешь использовать только поля текущей строки.
Аноним 29/12/20 Втр 00:56:42 23644528381
изображение.png 37Кб, 1722x241
1722x241
>>236444936
то же самое, но я в стабильности MS SQL не сомневался
Аноним 29/12/20 Втр 00:57:05 23644531082
>>236445183
так я тестил его, он не то выводит
Аноним 29/12/20 Втр 01:02:09 23644563983
>>236445283
А вообще, такие штуки забавно гонять на терабайтах данных, данные зашардованны по машинам и ты реально видишь все эти джойны на более низком уровне.

Видно сортироваки, поточные операции, оптимизации, вроде переноса условий наверх, и т.д.

Когда в MS работал, этим постоянно приходилось заниматься (снаружи это называют U-SQL).
Аноним 29/12/20 Втр 01:05:14 23644583484
изображение.png 8Кб, 657x256
657x256
изображение.png 22Кб, 873x336
873x336
изображение.png 25Кб, 1313x251
1313x251
>>236445257
Во, короче, там объебался, согласен.

Вот два варианта - один с exists, второй с count( )

второй SQL сильно хуже внутри. Сам создай таблицу на пол ляма записей и чекни, индекс навесь ток.
Аноним 29/12/20 Втр 01:05:35 23644585285
>>236445310
странно, у меня выводит снеговичка
Аноним 29/12/20 Втр 01:06:07 23644588286
изображение.png 40Кб, 963x1037
963x1037
Аноним 29/12/20 Втр 01:13:14 23644620487
>>236445882
у тебя persons без номеров цеха
Аноним 29/12/20 Втр 01:17:14 23644642988
Зачем тебе требование через not exists делать?
Я знаю как через 2 exists и 1 not exists делать. Но 2 not exists это хуета какая-то
Аноним 29/12/20 Втр 01:18:40 23644649889
>>2364>>236446429
Я это имел ввиду, либо два экзиста, либо два нот экзиста. Покажешь как через два экзиста ?
Аноним 29/12/20 Втр 01:23:55 23644683490
>>236444081
вы же понимаете что ускоряете запрос по базе на 100 строк? тут хоть коррелированными подзапросами считать, хоть фуллсканы, всем по барабану, вы главное строки нужные верните.
Аноним 29/12/20 Втр 01:25:07 23644690791
>>236446204
я их взял у кого-то, там вроде не было номера у них, он был в левой таблице
Аноним 29/12/20 Втр 01:26:12 23644697392
>>236446834
Мы ж на ms sql меряемся, там обычно данные покрупнее. Так то можно хоть перебором захуярить.
Аноним 29/12/20 Втр 01:36:08 23644742193
>>236446498
Моя идея это искать наличие цеха (exists) и внутри каждого цеха наличие рабочих (exists) и отсутствие тех у кого меньше 4 разряда (not exists)
```
select
from profession_dict
where exists (
select

from work_area_dict
where num = 7
and exists (
select from persons where work_area_dict.area_num = area_num and profession_dict.code = prof_code
)
and not exists (
select
from persons where category < 4 and work_area_dict.area_num = area_num and profession_dict.code = prof_code
)
)
```

Ещё скорее всего должно быть category <= 4 (так как в условии строго > 4), но я скопировал с ОП поста.
Аноним 29/12/20 Втр 01:37:41 23644749994
Разметка съела все '*'
Но кроме как после select их нигде нет
Аноним 29/12/20 Втр 01:42:21 23644769995
>>236447421
спасибо, но не то выводит
Аноним 29/12/20 Втр 01:50:21 23644805996
>>236447699
Ну так разбирайся с полями num=7 или area_num=7 и с фильтрами <=4 или <4.
Я не экстрасенс эти мелкие детали угадывать.
Аноним 29/12/20 Втр 01:52:01 23644811497
поля кстати да, смешные, где FK, где что, разбирайся как хочешь.
Настройки X
Ответить в тред X
15000
Макс объем: 20Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
X
Ваш шидевор X
Стикеры X
Избранное / Топ тредов