sql - игнорировать дубликаты при присоединении - PullRequest
0 голосов
/ 28 октября 2018

У меня есть две таблицы.Таблица1 состоит из 1591 строки.Таблица2 состоит из 270 строк.

Я хочу получить конкретные данные столбца из Таблицы2 на основе некоторых условий между ними, а также исключить дубликаты, которые находятся в Таблице2.Что я имею в виду, чтобы присоединиться к таблицам, но получить только одно значение из таблицы 2, даже если условие произошло более чем за время.Результат должен быть ровно 1591 строк.

Я пытался сделать левые, правые, внутренние соединения, но данные приходят больше или меньше 1591.

Пример Table1

type,address,name
40,blabla,Adam
20,blablabla,Joe

Table2

type,currency
40,usd
40,gbp
40,omr

Присоединение по типу Результат

type,address,name,currency
40,blabla,name,usd
20,blblbla,Joe,null

Ответы [ 4 ]

0 голосов
/ 28 октября 2018

Я типичный способ сделать это использует коррелированный подзапрос.Это гарантирует , что все строки в первой таблице сохраняются.И он генерирует ошибку, если из второй возвращается более одной строки.

Итак:

select t1.*,
       (select t2.currency
        from table2 t2
        where t2.type = t1.type
        fetch first 1 row only
       ) as currency
from table1 t1;

Вы не указываете, какую базу данных вы используете, поэтому используется стандартный синтаксис длявозвращение одного ряда.Некоторые базы данных используют limit или top вместо.

0 голосов
/ 28 октября 2018

попробуйте это должно работать

select *
from
Table1 h
inner join 
(select type,currency,ROW_NUMBER()over (partition by type order by 
currency) as rn
from 
Table2
) sr on
sr.type=h.type
and rn=1
0 голосов
/ 28 октября 2018

Вы можете использовать external apply , если оно поддерживается.

select a.type, a.address, a.name, b.currency
from Table1 a
outer apply (
    select top 1 currency
    from Table2
    where Table2.type = a.type
) b
0 голосов
/ 28 октября 2018

Попробуй это.Это стандартный SQL, поэтому он должен работать в вашей системе rdbms.

select * from Table1  AS t
LEFT OUTER JOIN Table2 AS y ON t.[type] = y.[type] and y.currency IN (SELECT MAX(currency) FROM Table2 GROUP BY [type])

Если вы хотите контролировать, к какой валюте присоединяться, рассмотрите возможность изменения таблицы 2, добавив новый столбец активный / неактивный и изменив соответственно JOIN пункт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...