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

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

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

Есть две таблицы. Таблица 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.09.2018, 10:16
Ответы с готовыми решениями:

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

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

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

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

11
298 / 264 / 112
Регистрация: 05.06.2013
Сообщений: 840
06.09.2018, 14:58 2
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

По идее 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  [ТС] 3
О, а так можно было. Работает, спасибо большое

Добавлено через 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
298 / 264 / 112
Регистрация: 05.06.2013
Сообщений: 840
10.09.2018, 12:34 4
Если я правильно понял(в чем я не уверен), что тут вообще надо сделать, то возможно так:
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  [ТС] 5
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  [ТС] 6
Вот таблица, и из нее, как я поняла, нужно получить только те значения которые помечены точкой.
0
Изображения
 
298 / 264 / 112
Регистрация: 05.06.2013
Сообщений: 840
10.09.2018, 14:56 7
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

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  [ТС] 8
Да, спасибо оба кода работают, первый выполняет мое начальное неверное условие, на всякий случай буду знать Второй код вывел все необходимое, ещё раз спасибо!

Добавлено через 15 минут
MySQL
1
WHERE (DUPLICATES_CNT + C1_NULL_DULLICATES_CNT + C2_NULL_DULLICATES_CNT + C3_NULL_DULLICATES_CNT = 4)
Однако в этом условии не предусмотрено, что могут быть просто две одинаковые строки например, та же строка 123 222 М если она будет в таблице два раза, то не выведется ни одна из этих записей
0
298 / 264 / 112
Регистрация: 05.06.2013
Сообщений: 840
10.09.2018, 18:31 9
ой ну заменить в 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  [ТС] 10
Хмм, что то ему это не нравится эта конструкция... Может я делаю что то не так?
0
Миниатюры
Вывести значения одной таблицы двумя запросами,где значения второго запроса должны исключить значения первого  
298 / 264 / 112
Регистрация: 05.06.2013
Сообщений: 840
10.09.2018, 18:52 11
Лучший ответ Сообщение было отмечено Кошара как решение

Решение

Добавьте ещё один "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  [ТС] 12
Еее, заработало Ну думаю, теперь, выводится точно все, что нужно, спасибо ещё раз
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2018, 18:58

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

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

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

Как для каждого значения одного массива вывести все значения второго массива?
Как для каждого значения одного массива вывести все значения второго массива? Есть два массива:...

Программа работает, но выводит разные значения Sx и Yx (значения должны быть одинаковыми)
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;math.h&gt; #pragma warning(disable : 4996) int...

Исключить из запроса пустые значения
Доброго времени суток! Есть несколько Edit'ов и несколько ComboBox'ов. Задача выполнить запрос в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.