Выберите первую строку в соединении двух таблиц в одном операторе

Вы также можете попробовать выполнить следующее

select id,cust_id,amount
from YourTable t1
where id =(select max(t2.id) from YourTable  t2 where t2.Cust_ID=t1.Cust_ID)
order by id
.
9
задан bluish 7 April 2014 в 14:42
поделиться

5 ответов

Если вы можете добавить во временную таблицу и затем запросить ее, вы можете сделать это за один раз.

WITH T AS (temp table select), RN AS (select min row-numbers from T) SELECT T.NAME, T.DATA1, T.DATA2 FROM T INNER JOIN RN on T.row_number = RN.row_number

Есть много других способов написать это, но вот как я делал подобные вещи.

0
ответ дан 4 December 2019 в 12:21
поделиться

Использование GROUP BY может помочь вам в этом, но будьте осторожны. Если вы сделаете что-то вроде этого:

Select A.NAME, min(B.DATA1), min(B.DATA2) 
From A Inner Join B on A.NAME = B.NAME 
Group by A.NAME;

Вы получите искомый результат:

  NAME      DATA1   DATA2
  sameName   1        2    
  otherName  5        7

Но только из-за данных, которые вы тестируете. Если вы измените данные так, чтобы вместо:

otherName  8        9

у вас было:

otherName  8        4

Возвращается:

  NAME      DATA1   DATA2
  sameName   1        2    
  otherName  5        4

Обратите внимание, что otherName не возвращает DATA1 и DATA2 из одной и той же записи!

Обновление: самостоятельное соединение сравнение с одним из значений данных может вам помочь, например:

SELECT a.*, b.* FROM a,b 
   LEFT JOIN b b2 ON b.name = b2.name AND b.data2 < b2.data2 
   WHERE a.name = b.name AND b2.data2 IS NOT NULL;

Однако это будет работать только в том случае, если значения в DATA2 уникальны для NAME.

7
ответ дан 4 December 2019 в 12:21
поделиться

Не уверен, решит ли это вашу проблему или нет, но вы можете попробовать использовать предложение GROUP BY и сгруппировать по одному из столбцов имени.

DB2 Group by tutorial

0
ответ дан 4 December 2019 в 12:21
поделиться

Попробуйте выполнить дедупликацию B следующим образом

SELECT  A.NAME, bb.DATA1, bb.DATA2 
FROM    A 
JOIN    B bb
ON      A.NAME = B.NAME
WHERE   NOT EXISTS (SELECT  *
                    FROM    B
                    WHERE   NAME = bb.NAME
                            AND (DATA1 > bb.DATA1
                                OR DATA1 = bb.DATA1 AND DATA2 > bb.DATA2))

Добавьте дополнительные операторы OR, если существует больше столбцов DATAx.

Если A также содержит дубликаты, просто используйте DISTINCT, как в OP.

0
ответ дан 4 December 2019 в 12:21
поделиться

Это будет работать:

with temp as (
    select A.NAME, B.DATA1, B.DATA2, 
        row_number() over (partition by A.NAME order by A.NAME) as rownum
    from TABLEA A inner join TABLEB B
    on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1

Если вы хотите выбрать наименьшее значение data1 и в нем data2, используйте этот вариант:

with temp as (
    select A.NAME, B.DATA1, B.DATA2, 
        row_number() over (partition by A.NAME order by B.DATA1, B.DATA2) as rownum
    from TABLEA A inner join TABLEB B
    on A.NAME = B.NAME
)
select NAME, DATA1, DATA2 from temp where rownum = 1

Оба запроса будут давать по одной строке на имя.

10
ответ дан 4 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: