Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 inner join пересечение данных  [new]
_s_e_r_g_e_
Member

Откуда:
Сообщений: 59
Добрый день, возник теоретический вопрос.

Есть таблица1

kod
1
1
2
3

и таблица2
kod
1
1
2
5
6

в запросе пишем следующее:

SELECT Таблица1.id, Таблица2.id
FROM Таблица3 INNER JOIN Таблица4 ON Таблица1.id = Таблица2.id;


и на выходе получаем следующее:

Таблица2.id Таблица1.id
1 1
1 1
1 1
1 1
2 2

Вопрос в следующем. Можно ли каким либо образом без использования группировки сделать так чтобы выводилось именно пересечение, т.е. на выходе должны получить:
Таблица2.id Таблица1.id
1 1
1 1
2 2

Сообщение было отредактировано: 23 янв 20, 09:50
23 янв 20, 09:48    [22064980]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
Выводится именно пересечение. Ибо в этих таблицах отсутствует возможность идентифицировать записи.

Можно в подзапросе нумеровать дубликаты, и при связывании требовать равенства не только кода, но и номера по порядку.
23 янв 20, 11:13    [22065061]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
drafty
Member

Откуда: Москва
Сообщений: 542
_s_e_r_g_e_
Добрый день, возник теоретический вопрос.
...
Вопрос в следующем. Можно ли каким либо образом без использования группировки сделать так чтобы выводилось именно пересечение, т.е. на выходе должны получить:
Таблица2.id Таблица1.id
1 1
1 1
2 2


Может так?
SELECT Таблица2.id, Таблица1.id
FROM Таблица2 INNER JOIN Таблица1 ON Таблица1.id = Таблица2.id
ORDER By Таблица2.id ASC;

Или я что-то "недогоняю"???
14 фев 20, 09:57    [22079764]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
drafty
Или я что-то "недогоняю"???
Просто воссоздай таблички (они ж маленькие) и выполни свой запрос...
14 фев 20, 14:07    [22080013]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
drafty
Member

Откуда: Москва
Сообщений: 542
Akina
drafty
Или я что-то "недогоняю"???
Просто воссоздай таблички (они ж маленькие) и выполни свой запрос...

...зафига?
В результате
SELECT Таблица2.id, Таблица1.id
FROM Таблица2 INNER JOIN Таблица1 ON Таблица1.id = Таблица2.id
ORDER By Таблица2.id ASC;

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

К сообщению приложен файл. Размер - 3Kb
14 фев 20, 14:46    [22080078]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4628
_s_e_r_g_e_,
а что должно остаться в следующем случае
Таблица2 Таблица1
1 1
1 1
1 4
3 2
2 2

какая единичка или двойка должны остаться
14 фев 20, 17:19    [22080228]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
ИВП
Member

Откуда:
Сообщений: 311
ПЕНСИОНЕРКА,
наверное, две единицы из правой таблицы (с такими же единицами из левой таблицы) и одна двойка из левой таблицы (с такой же двойкой из правой таблицы)
14 фев 20, 17:23    [22080233]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Прогер_самоучка
Member

Откуда:
Сообщений: 68838
drafty
...зафига?
для надо
drafty
должно получиться искомое
лично вам?
Коллега вам сказал, воссоздайте и удивитесь.
14 фев 20, 17:25    [22080234]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
drafty
Member

Откуда: Москва
Сообщений: 542
Прогер_самоучка
drafty
...зафига?
для надо
drafty
должно получиться искомое
лично вам?
Коллега вам сказал, воссоздайте и удивитесь.

...вы меня заинтриговали.В поннедел обязательно проэкспериментирую...
14 фев 20, 20:31    [22080367]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6436
_s_e_r_g_e_

Есть таблица1
kod
1
1
2
3
и таблица2
kod
1
1
2
5
6
Может я чё не понимаю:а что кодовые поля в обоих таблицах не уникальны??
Хотя в первой таблице оно должно быть уникальным а во второй полем связи со стороны многие (не уникальное)
Я так думаю! (Мимино)
14 фев 20, 21:14    [22080374]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
drafty
должно получиться искомое (логика выполнения запроса прилагается в иллюстрации)
Кривая логика порождает кривые ответы. Прочитай ещё раз самый первый пост-вопрос. Сравни запрос автора и твой (если, конечно, исправить ошибки в запросе автора и убрать не влияющую на результат сортировку из твоего - близнецы-братья). Посмотри, какой результат даёт такой запрос (я понимаю, что уверенность - достаточное основание игнорировать совет провести натурный эксперимент, но не надо путать уверенность с самоуверенностью, особенно необоснованной), сравни со своими ожиданиями. И иди, читай ещё раз про фантомные умножения при джойнах по неуникальным полям.

sdku
Может я чё не понимаю:а что кодовые поля в обоих таблицах не уникальны??
А где написано, что "код" обязан быть уникальным?

Сообщение было отредактировано: 14 фев 20, 21:41
14 фев 20, 21:41    [22080378]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6436
Akina
....А где написано, что "код" обязан быть уникальным?
А как идентифицировать записи?
16 фев 20, 00:25    [22080626]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
sdku
А как идентифицировать записи?
Да какая разница? что ж вы все стремитесь додумать за автора, и ответить не на его вопрос, а на тот, который вы ему придумаете взамен заданного? Вот никак - просто представь на секунду, что их НЕ НАДО идентифицировать. Или, в терминах заданного вопроса - имеется неуказанное и нафиг не нужное В ЭТОЙ ЗАДАЧЕ поле, которое однозначно идентифицирует запись, опять же за рамками ЭТОЙ задачи.
16 фев 20, 16:50    [22080767]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
drafty
Member

Откуда: Москва
Сообщений: 542
Прогер_самоучка
drafty
...зафига?
для надо
drafty
должно получиться искомое
лично вам?
Коллега вам сказал, воссоздайте и удивитесь.

Только что воссоздал,и получилось следующее:
11
11
11
22
две записи с единицами оказались лишними...
А по сему,по совету коллеги Akina в 22080378 - иду читать ещё раз про фантомные умножения при джойнах по неуникальным полям...
17 фев 20, 08:13    [22080961]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
drafty
Member

Откуда: Москва
Сообщений: 542
drafty
Прогер_самоучка
пропущено...
для надо
пропущено...
лично вам?
Коллега вам сказал, воссоздайте и удивитесь.

Только что воссоздал,и получилось следующее:
11
11
11

22
две записи с единицами оказались лишними...
А по сему,по совету коллеги Akina в 22080378 - иду читать ещё раз про фантомные умножения при джойнах по неуникальным полям...

т.е. получилось:
11
11
11
11
22
17 фев 20, 08:29    [22080966]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5497
_s_e_r_g_e_,

select kod1, kod2
from (
    select kod as kod1, (select kod from таблица2 as t2 where t2.kod = t1.kod) as kod2
    from таблица1 t1) as t
where t.kod2 is not null
17 фев 20, 10:35    [22081054]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
Rivkin Dmitry, а откуда Вы намерены получить NULL, если ни одно значение не NULL, и ни одного LEFT JOIN?
17 фев 20, 10:51    [22081073]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5497
Akina,

Если в таблица2 нет значений кода из таблица1
(select kod from таблица2 as t2 where t2.kod = t1.kod)
вернет null
Нет?
17 фев 20, 11:22    [22081100]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5497
Надо уточнить:

select kod1, kod2
from (
    select kod as kod1, (select [b]top 1[/b] kod from таблица2 as t2 where t2.kod = t1.kod) as kod2
    from таблица1 t1) as t
where t.kod2 is not null


иначе может быть ошибка...
17 фев 20, 11:29    [22081114]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5497
Надо уточнить:

select kod1, kod2
from (
    select kod as kod1, (select top 1 kod from таблица2 as t2 where t2.kod = t1.kod) as kod2
    from таблица1 t1) as t
where t.kod2 is not null


иначе может быть ошибка...
17 фев 20, 11:31    [22081116]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
Rivkin Dmitry
Если в таблица2 нет значений кода из таблица1
(select kod from таблица2 as t2 where t2.kod = t1.kod)
вернет null
Нет?
Ну в результате-то получится простейший INNER JOIN. Причём такой, которому чхать на количество равных значений - он их просто не различает.

Сообщение было отредактировано: 17 фев 20, 11:53
17 фев 20, 11:50    [22081135]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
В любом случае для решения задачи необходимо нумеровать записи с равным kod - т.е. преобразовывать данные из
kod
1
1
2
3

в
kod num
11
12
21
31

и соответственно для второй таблицы
kod num
11
12
21
51
61

И после этого уже связывать по t1.kod=t2.kod AND t1.num=t2.num.

Только так и можно получить требуемый результат.

Увы, но нумерация неуникальных записей в MS Access - это рожание ежа против шерсти. Ибо оконных фанкций тут нет от слова "совсем".
17 фев 20, 11:54    [22081139]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Rivkin Dmitry
Member

Откуда: Israel
Сообщений: 5497
Akina,

Это не твой совет - попробовать?

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

Вот результат запроса:

kod1 kod2
1 1
1 1
2 2
17 фев 20, 12:13    [22081167]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 6436
Akina
sdku
А как идентифицировать записи?
Да какая разница? ....

Akina
...Увы, но нумерация неуникальных записей в MS Access - это рожание ежа против шерсти. Ибо оконных фанкций тут нет от слова "совсем".
Немного противоречиво,однако
17 фев 20, 12:35    [22081217]     Ответить | Цитировать Сообщить модератору
 Re: inner join пересечение данных  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20002
sdku
Немного противоречиво,однако
SELECT kod, ROW_NUMBER() OVER (PARTITION BY kod)
ничем и никак не противоречиво.
Rivkin Dmitry
Вот результат запроса
Проверь свой запрос, добавив в первую таблицу ещё одну запись с kod=1.
17 фев 20, 15:33    [22081472]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft Access Ответить