SQL разделяет значения с одинаковым идентификатором из 2 таблиц - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 2 таблицы (это получение данных из основной таблицы).Пример:

Table1

       id      GroupX     Source    GroupNum     Amount  
-------------------------------------------------------
 1     23      School     SH001     1            700  
 2     23      Bank       BA001     2            300  
 3     23      Music      MU001     3            500  
 4     23      School     SH999     1            900  

Table2

     id    GroupNum     SourceAmt
----------------------------------
1    23    1            700  
2    23    2            100  
3    23    3            500  
4    23    1            900  

Моя дилемма связана с запросом, который я использую.Он возвращает дополнительные строки для разделенных значений (примечание в таблице 2 «GroupNum» имеет разделенное значение 700 и 900)

Мои результаты должны быть

     id    GroupX     Source    GroupNum     Amount     SourceAmt  
-----------------------------------------------------------------
 1   23    School     SH001     1            700        700  
 2   23    Bank       BA001     2            300        100  
 3   23    Music      MU001     3            500        500  
 4   23    School     SH999     1            900        900  

Но вместо этого я получаю это

     id    GroupX    Source     GroupNum     Amount     SourceAmt  
-----------------------------------------------------------------
 1   23    School     SH001     1            700        700  
 2   23    School     SH001     1            700        900  
 3   23    Bank       BA001     2            300        100  
 4   23    Music      MU001     3            500        500  
 5   23    School     SH999     1            900        900  
 6   23    School     SH999     1            900        700  

Вот мой запрос:

SELECT
    t1.id,
    t1.GroupX,
    t1.Source,
    t1.GroupNum,
    t1.Amount,
    t2.SourceAmt
FROM 
    table1 as t1
INNER JOIN 
    table2 as t2 ON t1.id = t2.id
                 AND t1.GroupNum = t2.GroupNum
WHERE 
    t1.id = 23 

Я также пытался использовать Distinct.Помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вам нужен дополнительный ключ join.Там нет очевидного кандидата, за исключением, возможно, за сумму - но я не уверен, что это то, что вы намерены.Таблицы SQL представляют неупорядоченные наборы, поэтому концепция сопоставления по "номеру строки" отсутствует.

Вы можете назначить номер строки, используя row_number().Следующее будет соответствовать, но вам нужно указать столбец заказа:

Select t1.id, t1.Group, t1.Source, t1.GroupNum, t1.Amount, t2.SourceAmt
From (select t1.*,
             row_number() over (partition by t1.id order by ?) as seqnum
      from table1 t1
     ) t1 inner join
     (select t2.*
             row_number() over (partition by t1.id order by ?) as seqnum
      from table2 t2 
     ) t2
     on t1.id = t2.id and t1.GroupNum = t2.GroupNum and
        t1.seqnum = t2.seqnum
where id = 23 ;

? для столбца заказа в каждой таблице.

0 голосов
/ 05 февраля 2019

Я бы выбрал другой подход из простого INNER JOIN, просто потому, что вы можете делать ограниченные вещи с этим набором результатов (вот набор результатов из этого внутреннего соединения)

image

Я бы сделал несколько соединений.

Сначала я бы LEFT JOIN с условием по умолчанию + where table1.[Amount] = table2.[SourceAmt].Это даст мне установить, где [Amount] и [SourceAmt] равны

После этого я INNER JOIN с условием по умолчанию, чтобы получить суммы, которые не совпадают

Вот запрос

with t1 as
(
    select 23 as [id], 'School' as [Group], 'SH001' as [Source], 1 as [GroupNum], 700 as [Amount]
    union all
    select 23, 'Bank', 'BA001', 2, 300
    union all
    select 23, 'Music', 'MU001', 3, 500
    union all
    select 23, 'School', 'SH999', 1, 900
),
t2 as
(
    select 23 as [id], 1 as [GroupNum], 700 as [SourceAmt]
    union all
    select 23, 2, 100
    union all
    select 23, 3, 500
    union all
    select 23, 1, 900
)
select t1.*, a.*, b.*
from t1 
left join t2 as a on 
    t1.[id]       = a.[id] 
and t1.[GroupNum] = a.[GroupNum]
and t1.[Amount]   = a.[SourceAmt]
inner join t2 as b on
    t1.[id]       =  b.[id]
and t1.[GroupNum] =  b.[GroupNum]
where t1.[id] = 23

А вот набор результатов, который вы можете проверить image

Теперь я использую этот результат в качестве предварительного результатана самом деле, и сделаем небольшой трюк со столбцами CASE и [takeIt], вот последний запрос

with t1 as
(
    select 23 as [id], 'School' as [Group], 'SH001' as [Source], 1 as [GroupNum], 700 as [Amount]
    union all
    select 23, 'Bank', 'BA001', 2, 300
    union all
    select 23, 'Music', 'MU001', 3, 500
    union all
    select 23, 'School', 'SH999', 1, 900
),
t2 as
(
    select 23 as [id], 1 as [GroupNum], 700 as [SourceAmt]
    union all
    select 23, 2, 100
    union all
    select 23, 3, 500
    union all
    select 23, 1, 900
),
res as
(
    select t1.[id],
           t1.[Group],
           t1.[Source],
           t1.[GroupNum],
           t1.[Amount],
           isnull(a.[SourceAmt], b.[SourceAmt]) as [SourceAmt],
           case when a.[SourceAmt] is null or a.[SourceAmt] = b.[SourceAmt] then 1
                else 0
           end as [takeIt]
    from t1 
    left join t2 as a on 
        t1.[id]       = a.[id] 
    and t1.[GroupNum] = a.[GroupNum]
    and t1.[Amount]   = a.[SourceAmt]
    inner join t2 as b on
        t1.[id]       = b.[id]
    and t1.[GroupNum] = b.[GroupNum]
    where t1.[id] = 23
)
select [id],
       [Group],
       [Source],
       [GroupNum],
       [Amount],
       [SourceAmt]
from res
where [takeIt] = 1
0 голосов
/ 05 февраля 2019

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

Select t1.id, t1.Group, t1.Source, t1.GroupNum, t1.Amount, t2.SourceAmt
From table1 as t1 INNER JOIN
     table2 as t2 
     ON t1.id = t2.id AND t1.GroupNum = t2.GroupNum AND t1.Amount = t2.SourceAmt
where id = 23

Если это не , что вы хотите, или вы бы предпочлине присоединяться, используя суммы (например, вы не можете гарантировать, что вы не увидите одну и ту же сумму более одного раза), тогда вы немного озадачены;вы заметите, что (id, GroupNum) кортежи не являются уникальными ни в одной из таблиц, и, следовательно, ваше объединение не является взаимно-однозначным.Возможно, вы захотите включить Source в table2 или иным образом предоставить transactionId в таблице1, которая сопоставляется со столбцом уникального идентификатора в table2.

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