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

Есть таблица 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
Запрос с UNION внутри таблицы
    #39379320
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если правильно понял...
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
Запрос с UNION внутри таблицы
    #39379340
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_world,

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

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

Вы мне очень помогли - вместо таблицы Clients я указал свой запрос, который отбирает пары подмножеств, а дальше уже вашим запросом отбираются записи с максимальной датой.
...
Рейтинг: 0 / 0
Запрос с UNION внутри таблицы
    #39379355
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39379357
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_world,

хотя все же есть некоторые несоответствия когда выполняю это на реальных данных:
например вместо
Код: plaintext
15  77  21/12/2012
запрос поменял местами пары:
Код: plaintext
77  15  21/12/2012
...
Рейтинг: 0 / 0
Запрос с UNION внутри таблицы
    #39379367
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39379375
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

это походу то что нужно!
Спасибо Вам большое!
...
Рейтинг: 0 / 0
Запрос с UNION внутри таблицы
    #39379584
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39379594
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39379597
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Miko_v,

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

... зачем две таблицы - хороший вопрос :) об этом долго рассказывать, вкратце: есть два массива с почти идентичными данными, но
каждая из таблиц отображает разный вид деятельности. И добавлять в моем случае флажки не вариант. Т.е. задача состоит именно в том чтобы написать запросы.
...
Рейтинг: 0 / 0
Запрос с UNION внутри таблицы
    #39379893
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39380003
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39380005
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39380009
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39380015
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Запрос с UNION внутри таблицы
    #39380017
Miko_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_rusimport,

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

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


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