Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8

Вывести значения одной таблицы двумя запросами,где значения второго запроса должны исключить значения первого

06.09.2018, 10:16. Показов 4993. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть две таблицы. Таблица GRP c полями NameGroup и CodElementGroup. Содержание её таково: Группа_1 - ааа, Группа_1 - ббб, Группа_1 - ввв, Группа_2 - ддд, Группа_2 - ааа. Таблица Data c полями Cod, содержащая такие коды : ааа, ооо,ггг, ввв, ддд,ббб. Задание заключается в том, что нужно вывести название группы и коды(из таблицы Data) только тех групп у которых есть три кода элемента (в данном случае это Группа_1 с кодами "ааа,ббб,ввв").

Я решила эту часть таким вот образом:

MySQL Скопировано
1
2
3
4
5
6
Select  Cod,NameGroup
from Data join GRP
on Data.Cod = GRP.CodElementGroup
where NameGroup IN(
select NameGroup from GRP 
group by NameGroup HAVING count(*)=3)
Вторая часть задания заключается в том, что нужно вывести оставшиеся коды которые не вошли в запись групп из 3х элементов или вообще не вошли ни в одну группу. То есть вывести код "ддд" группы_2, и оставшиеся коды ооо,ггг из второй таблицы.
Попыталась сделать это так:

MySQL Скопировано
1
2
3
4
5
6
7
8
9
10
select Cod
from Data left join GRP
on Data.Cod = GRP.CodElementGroup
where GRP.CodElementGroup IS NULL 
 
union 
select CodElementGroup from GRP 
where NameGroup NOT IN(
select NameGroup from GRP 
group by NameGroup HAVING count(*)>=3 )
Вывел лишний код "ааа" группы _2, который уже состоит в записи в группе_1.

Не знаю как сделать так чтобы код понимал, что он уже есть в другой группе которая не подходит второму условию задачи.
Точнее я попробовала отдельно вывести коды которые одинаковы и имеют разные группы...

MySQL Скопировано
1
2
3
4
5
6
select G1.CodElementGroup,G1.NameGroup from GRP G1, GRP G2 
where G1.NameGroup<>G2.NameGroup and EXISTS (
select CodElementGroup from GRP 
where G1.CodElementGroup = G2.CodElementGroup and G1.NameGroup IN(
select G1.NameGroup from GRP 
group by NameGroup HAVING count(*)=3 ))
Осталось только как то исключить этот результат из предыдущего запроса, но не могу сообразить каким образом это сделать, и можно ли вообще это как то сделать. Возможно этого и не нужно делать, а стоит лишь добавить дополнительное условие во второй запрос, но, как я не изгалялась, не получалось. Помогите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2018, 10:16
Ответы с готовыми решениями:

Вывести на экран два массива, элементами первого являются элементы, меньшие заданного значения, элементами второго - большие заданного значения
Задан массив целых чисел. Вывести на экран два массива, элементами первого являются элементы, меньшие заданного значения, элементами...

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

Найти три наименьших значения первого массива и три наибольших значения второго, попарно поменять их местами
Помогите пожалуйста с решением задачи. А то на ум вообще ничего не приходит:( Даны два массива x1, x2, ..., xn и y1, y2, ..., yn....

11
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
06.09.2018, 14:58
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

По идее 2я часть задания должна работать как-то вот так:
SQL Скопировано
1
2
3
4
5
6
7
8
SELECT Cod 
  FROM DATA 
 WHERE Cod NOT IN (SELECT CodElementGroup 
                     FROM GRP
                    WHERE NameGroup IN (SELECT NameGroup 
                                          FROM GRP 
                                         GROUP BY NameGroup 
                                        HAVING COUNT(*)>=3))
1
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
08.09.2018, 15:53  [ТС]
О, а так можно было. Работает, спасибо большое

Добавлено через 55 минут
Jefe, а какой предикат использовать когда нужно выборку сделать не по одному параметру, а например по трем? Есть у меня такая задача, где нужно вывести три поля, чьи строки не повторяются в таблице, также не нужно выводить те строки где есть одна пустая ячейка, но остальные поля имеют повтор в таблице.

Тут я вывела те строки которые не имеют повтора, а также не имеют пустых полей.

MySQL Скопировано
1
2
3
select distinct Pole1,Pole2,Pole3
from TAB 
where Pole1 IS NOT NULL and Pole2 IS NOT NULL and Pole3 IS NOT NULL
А вот тут я нашла те строки которые повторяются и одна из них например имеет пустое поле:

MySQL Скопировано
1
2
3
4
5
select distinct T1.Pole1,T1.Pole2,T1.Pole3
from TAB T1,TAB T2
where (T1.Pole1 IS NULL and T1.Pole2=T2.Pole2 and T1.Pole3=T2.Pole3) OR 
(T1.Pole1=T2.Pole1 and T1.Pole2 IS NULL and T1.Pole3=T2.Pole3) OR 
(T1.Pole1=T2.Pole1 and T1.Pole2=T2.Pole2 and T1.Pole3 IS NULL)
Как сделать наоборот, чтобы он не выводил эти результаты?
0
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
10.09.2018, 12:34
Если я правильно понял(в чем я не уверен), что тут вообще надо сделать, то возможно так:
SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
SELECT c1, c2, c3
  FROM (SELECT t.*
             , COUNT(*) OVER (partition BY c1, c2, c3) AS duplicates_cnt
             , COUNT(*) OVER (partition BY c2, c3) AS c1_null_dullicates_cnt
             , COUNT(*) OVER (partition BY c1, c3) AS c2_null_dullicates_cnt
             , COUNT(*) OVER (partition BY c1, c2) AS c3_null_dullicates_cnt
          FROM t) t
 WHERE (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NOT NULL AND duplicates_cnt = 1)
    OR (c1 IS NULL     AND c2 IS NOT NULL AND c3 IS NOT NULL AND c1_null_dullicates_cnt = 1)
    OR (c1 IS NOT NULL AND c2 IS NULL     AND c3 IS NOT NULL AND c2_null_dullicates_cnt = 1)
    OR (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NULL     AND c3_null_dullicates_cnt = 1);
Добавлено через 9 минут
Цитата Сообщение от Кошара Посмотреть сообщение
нужно вывести три поля, чьи строки не повторяются в таблице.
Тут я вывела те строки которые не имеют повтора, а также не имеют пустых полей.
И не ясно, нужно вывести только те, которые не имеют повторов или же вывести просто без повторов? Это принципиально разные задачи.
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
10.09.2018, 13:16  [ТС]
Jefe, Так, нашла у себя ошибку в задании, нужно вывести строки без повтора, где например есть две строки: (1 2 3) и строка (1 2 NULL), и нужно будет вывести как раз таки строку 1 2 NULL, потому что 1 2 3, может быть дубликатом этой записи(т.к. NULL может иметь любое значение). Ну и также просто вывести без дубликатов строки с полным набором значений, в которых нет совпадений со строками в которых есть нулевые поля, воот
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
10.09.2018, 13:26  [ТС]
Вот таблица, и из нее, как я поняла, нужно получить только те значения которые помечены точкой.
Изображения
 
0
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
10.09.2018, 14:56
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

Ok, мой запрос который чуть выше выполняется вообще?

Добавлено через 16 минут
SQL Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
SELECT DISTINCT c1, c2, c3
  FROM (SELECT t.*
             , COUNT(*) OVER (partition BY c1, c2, c3) AS duplicates_cnt
             , COUNT(*) OVER (partition BY c2, c3) AS c1_null_dullicates_cnt
             , COUNT(*) OVER (partition BY c1, c3) AS c2_null_dullicates_cnt
             , COUNT(*) OVER (partition BY c1, c2) AS c3_null_dullicates_cnt
          FROM t) t
 WHERE (DUPLICATES_CNT + C1_NULL_DULLICATES_CNT + C2_NULL_DULLICATES_CNT + C3_NULL_DULLICATES_CNT = 4)
    OR (c1 IS NULL     AND c2 IS NOT NULL AND c3 IS NOT NULL AND c1_null_dullicates_cnt > 1)
    OR (c1 IS NOT NULL AND c2 IS NULL     AND c3 IS NOT NULL AND c2_null_dullicates_cnt > 1)
    OR (c1 IS NOT NULL AND c2 IS NOT NULL AND c3 IS NULL     AND c3_null_dullicates_cnt > 1)
    ;
Вот такой запрос на вашем наборе данных вернул выделенные точкой строки.
Но не знаю какой версии у вас MySQL, могут аналитический функции и не работать
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
10.09.2018, 18:28  [ТС]
Да, спасибо оба кода работают, первый выполняет мое начальное неверное условие, на всякий случай буду знать Второй код вывел все необходимое, ещё раз спасибо!

Добавлено через 15 минут
MySQL Скопировано
1
WHERE (DUPLICATES_CNT + C1_NULL_DULLICATES_CNT + C2_NULL_DULLICATES_CNT + C3_NULL_DULLICATES_CNT = 4)
Однако в этом условии не предусмотрено, что могут быть просто две одинаковые строки например, та же строка 123 222 М если она будет в таблице два раза, то не выведется ни одна из этих записей
0
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
10.09.2018, 18:31
ой ну заменить в 7й строке
SQL Скопировано
1
FROM t) t
на
SQL Скопировано
1
FROM (SELECT DISTINCT c1, c2, c3 FROM t)) t
и убрать "DISTINCT" в первой.
0
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
10.09.2018, 18:45  [ТС]
Хмм, что то ему это не нравится эта конструкция... Может я делаю что то не так?
Миниатюры
Вывести значения одной таблицы двумя запросами,где значения второго запроса должны исключить значения первого  
0
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
10.09.2018, 18:52
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

Добавьте ещё один "TAB" между двумя скобками.
Что бы выглядело:
SQL Скопировано
1
FROM (SELECT DISTINCT c1, c2, c3 FROM TAB) TAB) TAB
1
0 / 0 / 0
Регистрация: 06.09.2018
Сообщений: 8
10.09.2018, 18:58  [ТС]
Еее, заработало Ну думаю, теперь, выводится точно все, что нужно, спасибо ещё раз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2018, 18:58
Помогаю со студенческими работами здесь

Составить программу и вывести на экран в виде таблицы значения х, значения у
Составить программу и вывести на экран в виде таблицы значения х, значения у. Для х изменяющегося от +8 до -8.

Массивы. Найти максимальные и минимальные значения. В строках, где находятся искомые значения все значения обратить в ноль и вернуть номер строки
Всем привет! Вот такая задачка: Ввести двумерный массив 5х6. Найти максимальные и минимальные значения. В строках, где находятся искомые...

Циклы. Вывести значения элементов, начиная с первого, так что бы значение выводимого элемента было больше значения предыдущего выведенного
Пожалуйста помогите решить задачи. Все задачи на тему: &quot;Циклы&quot;. Условие задач в спойлерах , кто решит хотя бы что-нибудь буду очень...

Запрос, который выведет таблицу с двумя колонками содержащими значения одной колонки другой таблицы
Никак не могу понять, каким запросом можно вывести таблицу с двумя колонками содержащими значения одной колонки другой таблицы. Скорее...

Как для каждого значения одного массива вывести все значения второго массива?
Как для каждого значения одного массива вывести все значения второго массива? Есть два массива: Array ( =&gt; 163 =&gt;...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер