Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос с UNION внутри таблицы / 20 сообщений из 20, страница 1 из 1
03.01.2017, 21:50
    #39379310
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Всем добрый вечер!

Есть таблица Clients с тремя полями User, Contact - числовые, DT -дата/время

пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
User   Contact         DT
51       112        05/10/2013
52       112        18/10/2013
87       11         19/10/2010
112      51         21/10/2011
112      51         21/10/2011
112      52         22/10/2011
112      52         23/10/2011
118      56         23/10/2011
230      59         24/10/2012

Из таблицы нужно вычленить подмножество совпадающих пар User/Contact и Contact/User причем нужно отобрать записи с максимальной датой. Например, первое подмножество объединяет записи где User=51, Contact=112 и User=112, Contact=51
причем запрос должен отобрать из этого подмножества запись с максимальной датой:
Код: plaintext
1.
User          Contact     DT
51            112         05/10/2013
и так нужно выбрать все подмножества совпадающих пар с максимальной датой.

Составил следующий запрос, который вроде как выбирает совпадающие пары:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT Clients.*
FROM Clients INNER JOIN Clients AS Clients_1 ON (Clients.Contact = Clients_1.User) AND (Clients.User = Clients_1.Contact)

UNION SELECT Clients_1.*
FROM Clients INNER JOIN Clients AS Clients_1 ON (Clients.Contact = Clients_1.User) AND (Clients.User = Clients_1.Contact)
ORDER BY Clients.User, Clients.Contact, Clients.DT;


но вот задать фильтрацию по дате пока не получается :(

Прошу Вашей помощи, подскажите как такое можно реализовать?
...
Рейтинг: 0 / 0
03.01.2017, 22:14
    #39379320
mds_world
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Если правильно понял...
Miko_v, попробуйте запрос
Код: sql
1.
2.
3.
4.
5.
6.
select u, c, max(DT) as d
from
(select iif(User<=Contact,User,Contact) as u, iif(User>Contact,User,Contact) as c, DT 
from Clients
order by 1,2) z
group by u, c
...
Рейтинг: 0 / 0
03.01.2017, 22:50
    #39379340
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
mds_world,

спасибо за помощь, по дате отфильтровывает,
но в выборку попадают лишние записи у которых нет перекрестно совпадающих пар (см. скрин-шот).
( например запись
Код: plaintext
87	11	19/10/2010
не имеет обратной пары, например
Код: plaintext
11	87	14/11/2011
поэтому в результат выборки попадать не должна)
...
Рейтинг: 0 / 0
03.01.2017, 23:00
    #39379346
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
mds_world,

В любом случае спасибо Вам большое!

Вы мне очень помогли - вместо таблицы Clients я указал свой запрос, который отбирает пары подмножеств, а дальше уже вашим запросом отбираются записи с максимальной датой.
...
Рейтинг: 0 / 0
03.01.2017, 23:14
    #39379355
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_vmds_world,

спасибо за помощь, по дате отфильтровывает,
но в выборку попадают лишние записи у которых нет перекрестно совпадающих пар (см. скрин-шот).
( например запись
Код: plaintext
87	11	19/10/2010
не имеет обратной пары, например
Код: plaintext
11	87	14/11/2011
поэтому в результат выборки попадать не должна)
Код: sql
1.
2.
3.
4.
5.
6.
7.
select u, c, max(DT) as d
from
(select iif(User<=Contact,User,Contact) as u, iif(User>Contact,User,Contact) as c, DT 
from Clients
order by 1,2) z
group by u, c
having count(*)>1 


:)
...
Рейтинг: 0 / 0
03.01.2017, 23:17
    #39379357
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
mds_world,

хотя все же есть некоторые несоответствия когда выполняю это на реальных данных:
например вместо
Код: plaintext
15  77  21/12/2012
запрос поменял местами пары:
Код: plaintext
77  15  21/12/2012
...
Рейтинг: 0 / 0
03.01.2017, 23:43
    #39379367
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_vmds_world,

хотя все же есть некоторые несоответствия когда выполняю это на реальных данных:
например вместо
Код: plaintext
15  77  21/12/2012
запрос поменял местами пары:
Код: plaintext
77  15  21/12/2012

если важен порядок цифр в парах, попробуйте так
Код: sql
1.
2.
3.
4.
5.
SELECT Clients.User, Clients.Contact, Clients.DT
FROM Clients INNER JOIN (SELECT u, c, max(DT) AS d
FROM (SELECT iif(User<=Contact,User,Contact) AS u, iif(User>Contact,User,Contact) AS c, DT FROM Clients ORDER BY 1, 2) AS z
GROUP BY u, c
HAVING count(*)>1) as  z1 ON (Clients.DT=z1.d) AND (Clients.User=z1.u Or Clients.User=z1.c) AND (Clients.Contact=z1.u Or Clients.Contact=z1.c)
...
Рейтинг: 0 / 0
04.01.2017, 00:24
    #39379375
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
guest_rusimport,

это походу то что нужно!
Спасибо Вам большое!
...
Рейтинг: 0 / 0
04.01.2017, 22:34
    #39379584
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
guest_rusimport,

а можно еще один вопрос - в результате работы запроса получилась выборка из Clients с совпадающими датами. Теперь мне нужно
связать эту выборку (назовем ее SC) с другой таблицей Mails у которой идентичная структура. Но выбрать нужно следующее (но уже без фильтрации даты) из таблицы Mails:
1. совпадения пар в таблице Mails, которые есть в SC
WHERE SC.User = Mails.User AND SC.Contact = Mails.Contact

2. случай, когда в таблице Mails есть только User-ы, которые есть в SC
WHERE SC.User = Mails.User

3. случай, когда в таблице Mails есть только Contact-ы, которые есть в SC
AND SC.Contact = Mails.Contact
подскажите пожалуйста, а то уже совсем запутался.
...
Рейтинг: 0 / 0
04.01.2017, 23:17
    #39379594
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_v,

Прокоментируйте пожалуйста запросы:
1-й случай, совпадающие пары:
Код: sql
1.
2.
3.
SELECT  Mails.User,  Mails.Contact,  Mails.DT
FROM  Mails INNER JOIN SF ON SF.User =  Mails.User
WHERE SF.Contact =  Mails.Contact;



2-й случай:
Код: sql
1.
2.
3.
SELECT Mails.User, Mails.Contact, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact <> Mails.Contact;



3-й случай:
Код: sql
1.
2.
3.
SELECT Mails.User, Mails.Contact, Mails.DT
FROM Mails INNER JOIN SF ON SF.Contact = Mails.Contact
WHERE SF.User <> Mails.User;


прошу ваших советов!
...
Рейтинг: 0 / 0
04.01.2017, 23:35
    #39379597
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_v,

прошу прощения попутал в запросах - написал SF вместо SC.
...
Рейтинг: 0 / 0
05.01.2017, 00:23
    #39379607
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_v ...Теперь мне нужно связать эту выборку (назовем ее SC) с другой таблицей Mails у которой идентичная структура... стесняюсь спросить: а зачем в БД две одинаковые таблицы? Может стоит в первую добавить флажок/флажки(или поле/поля) а вторую удалить нахфиг (глядишь и связывать будет нечего)
...
Рейтинг: 0 / 0
05.01.2017, 09:39
    #39379655
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
sdkuMiko_v ...Теперь мне нужно связать эту выборку (назовем ее SC) с другой таблицей Mails у которой идентичная структура... стесняюсь спросить: а зачем в БД две одинаковые таблицы? Может стоит в первую добавить флажок/флажки(или поле/поля) а вторую удалить нахфиг (глядишь и связывать будет нечего)

... зачем две таблицы - хороший вопрос :) об этом долго рассказывать, вкратце: есть два массива с почти идентичными данными, но
каждая из таблиц отображает разный вид деятельности. И добавлять в моем случае флажки не вариант. Т.е. задача состоит именно в том чтобы написать запросы.
...
Рейтинг: 0 / 0
06.01.2017, 00:18
    #39379893
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_vMiko_v,

Прокоментируйте пожалуйста запросы:
1-й случай, совпадающие пары:
Код: sql
1.
2.
3.
SELECT  Mails.User,  Mails.Contact,  Mails.DT
FROM  Mails INNER JOIN SF ON SF.User =  Mails.User
WHERE SF.Contact =  Mails.Contact;



2-й случай:
Код: sql
1.
2.
3.
SELECT Mails.User, Mails.Contact, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact <> Mails.Contact;



3-й случай:
Код: sql
1.
2.
3.
SELECT Mails.User, Mails.Contact, Mails.DT
FROM Mails INNER JOIN SF ON SF.Contact = Mails.Contact
WHERE SF.User <> Mails.User;


прошу ваших советов!

не совсем понял, что же , всё-таки, нужно ... возможно это ?
Код: sql
1.
2.
SELECT  Mails.User,  Mails.Contact,  Mails.DT
FROM  Mails INNER JOIN SF ON (SF.User =  Mails.User and SF.Contact =  Mails.Contact) or (SF.User =  Mails.Contact and SF.Contact =  Mails.User) or (SF.User = Mails.User and SF.Contact <> Mails.Contact) or (SF.Contact = Mails.Contact and SF.User <> Mails.User)
...
Рейтинг: 0 / 0
06.01.2017, 11:21
    #39380003
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
guest_rusimport

не совсем понял, что же , всё-таки, нужно ... возможно это ?
Код: sql
1.
2.
SELECT  Mails.User,  Mails.Contact,  Mails.DT
FROM  Mails INNER JOIN SF ON (SF.User =  Mails.User and SF.Contact =  Mails.Contact) or (SF.User =  Mails.Contact and SF.Contact =  Mails.User) or (SF.User = Mails.User and SF.Contact <> Mails.Contact) or (SF.Contact = Mails.Contact and SF.User <> Mails.User)



по логике соединений скорее всего да, но запрос не отрабатывает, выдает окно:
Код: plaintext
1.
Введите значение параметра
Mails.Contact
...
Рейтинг: 0 / 0
06.01.2017, 11:25
    #39380005
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_v,

пока что пользуюсь таким вот объединением запросов:

Код: sql
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.
SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact = Mails.Owner;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.User =  Mails.Owner;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails, SF
WHERE SF.User = Mails.Owner AND SF.Contact = Mails.User;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.Contact = Mails.Owner
WHERE SF.User <> Mails.User;

UNION SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact <> Mails.Owner;
...
Рейтинг: 0 / 0
06.01.2017, 11:27
    #39380009
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_vguest_rusimport

не совсем понял, что же , всё-таки, нужно ... возможно это ?
Код: sql
1.
2.
SELECT  Mails.User,  Mails.Contact,  Mails.DT
FROM  Mails INNER JOIN SF ON (SF.User =  Mails.User and SF.Contact =  Mails.Contact) or (SF.User =  Mails.Contact and SF.Contact =  Mails.User) or (SF.User = Mails.User and SF.Contact <> Mails.Contact) or (SF.Contact = Mails.Contact and SF.User <> Mails.User)



по логике соединений скорее всего да, но запрос не отрабатывает, выдает окно:
Код: plaintext
1.
Введите значение параметра
Mails.Contact


возможно, если вы скопировали запрос с форума , где-то "закрались" русские буквы... попробуйте перенабрать запрос заново
...
Рейтинг: 0 / 0
06.01.2017, 11:33
    #39380015
guest_rusimport
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
Miko_vMiko_v,

пока что пользуюсь таким вот объединением запросов:

Код: sql
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.
SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact = Mails.Owner;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.User =  Mails.Owner;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails, SF
WHERE SF.User = Mails.Owner AND SF.Contact = Mails.User;

UNION

SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.Contact = Mails.Owner
WHERE SF.User <> Mails.User;

UNION SELECT Mails.User, Mails.Owner, Mails.DT
FROM Mails INNER JOIN SF ON SF.User = Mails.User
WHERE SF.Contact <> Mails.Owner;



так у вас и нет никакого Mails.Contact , у вас оказывается Mails.Owner , поэтому и параметр запрашивает :)
...
Рейтинг: 0 / 0
06.01.2017, 11:39
    #39380017
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
guest_rusimport,

Да, Вы правы, перенабрал запрос и все заработало!
Спасибо Вам большое!!!
...
Рейтинг: 0 / 0
06.01.2017, 11:40
    #39380018
Miko_v
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с UNION внутри таблицы
guest_rusimport,

да-да! это я в трех соснах запутался :)
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Запрос с UNION внутри таблицы / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]