LEFT JOIN Дублирование строк

В таблице 1 поле соединения (поле Y) многократно дублируется в этой таблице, хотя каждая строка в целом уникальна.

Когда я пытаюсь запустить left join, я получаю в 20 раз больше строк, чем ожидалось. Я безуспешно пытался использовать решения этого поста.

Я ожидаю, что объединение даст ровно столько строк, сколько table1 без объединения. Объединение просто добавило бы еще один столбец (fieldX)

Есть идеи?

SELECT 
    table1.*, table2.fieldZ
FROM
    table1
LEFT JOIN
    table2
ON
    table2.fieldX = table1.fieldY
WHERE
    criteria1 = '01/01/2019'
AND
    criteria2 > '0'
ORDER BY
    criteria2

На фото ниже:

fieldz = Routing #
fieldX = Bank Account # (Из таблицы2)
fieldY = Bank Account # (Из таблицы1)

введите здесь описание изображения

* К этому можно присоединиться по студенческому билету или номеру банковского счета, но проблема остается неизменной независимо от того, что и студенческий номер, и номер банковского счета появляются несколько раз в таблице 1`


person urdearboy    schedule 02.07.2019    source источник
comment
Для каждого table1.fieldY будет столько строк, сколько совпало table2.fieldX из table2, или 1, если соответствия нет.   -  person forpas    schedule 03.07.2019
comment
Если в таблице 2 есть несколько строк с одним и тем же полем x, то именно поэтому вы видите дубликаты.   -  person Jonathan Porter    schedule 03.07.2019
comment
Вы можете начать с этого теста. Это не должно возвращать никаких строк. Если он вернет любую строку, он покажет вам, какое значение fieldx имеет дубликаты в таблице2. Если у вас есть дубликаты в таблице 2, когда вы присоединитесь к ней с таблицей 1, она отобразит повторяющиеся строки таблицы 1 (по одной для каждого относительного значения в таблице 2). SELECT fieldx FROM table2 GROUP BY fieldx HAVING COUNT(1) › 1;   -  person Marcelo Myara    schedule 03.07.2019
comment
В моем сообщении была опечатка, которая может изменить это (импорт fieldz и присоединение к fieldx и fieldy) @MarceloMyara. Извините, только начал изучать SQL вчера, лол   -  person urdearboy    schedule 03.07.2019
comment
Это не имеет никакого значения. Условие table2.fieldX = table1.fieldY объединяет таблицы. Таким образом, будет столько строк, сколько совпадений между этими столбцами.   -  person forpas    schedule 03.07.2019
comment
Разместите образцы данных, потому что трудно понять, что вы подразумеваете под дубликатами.   -  person forpas    schedule 03.07.2019
comment
Хорошо, тогда для каждой строки в таблице 1 столбец Car будет соответствовать 1 или более строкам таблицы 2 в столбце fieldX, когда 2 столбца равны. Вот как работает соединение.   -  person forpas    schedule 03.07.2019
comment
@forpas я обновил пример ввода и желаемого результата   -  person urdearboy    schedule 03.07.2019
comment
Посмотрите мой ответ и проверьте, делаете ли вы что-то другое   -  person forpas    schedule 03.07.2019


Ответы (2)


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

person alexherm    schedule 02.07.2019
comment
На самом деле это не обязательно должно быть 1:1, оно просто должно быть уникальным для table2. - person Bryant; 03.07.2019

С этим запросом:

select t1.*, t2.routing 
from table1 t1 left join table2 t2
on t2.studentid = t1.studentid

или это:

select t1.*, t2.routing 
from table1 t1 left join table2 t2
on t2.bankaccount = t1.bankaccount

вы получите следующие результаты:

> studentid | bankaccount |  gpa | semester | routing
> --------: | ----------: | ---: | :------- | :------
>         1 |      123456 |      | Fall     | abc    
>         1 |      123456 |      | Spring   | abc    
>         1 |      123456 |      | Summer   | abc    
>         2 |      456789 |      | Fall     | def    
>         2 |      456789 |      | Spring   | def    
>         2 |      456789 |      | Summer   | def    
>         3 |      321654 |      | Fall     | ghi    
>         3 |      321654 |      | Spring   | ghi    
>         3 |      321654 |      | Summer   | ghi

Вы можете посмотреть демонстрацию.

person forpas    schedule 03.07.2019
comment
Значит, другие аргументы, которые у меня есть, портят мне жизнь? - person urdearboy; 03.07.2019
comment
Предложение WHERE не увеличивает количество строк запроса. - person forpas; 03.07.2019
comment
Вы отметили только sql. Какую СУБД или инструмент вы используете? - person forpas; 03.07.2019
comment
Presto, у которого, похоже, нет тега. Мне сказали, что это похоже на raptor? Не уверен, хотя - я буквально начал SQL на этой неделе. Я не могу понять это для жизни меня - person urdearboy; 04.07.2019
comment
Я уверен, что либо данные, которые вы запрашиваете, отличаются от того, что вы думаете, либо вы делаете что-то не так. Опубликуйте полученные результаты. - person forpas; 04.07.2019