Как получить только 1 верхнюю строку из второй таблицы в SQL Join - PullRequest
1 голос
/ 04 июля 2019

Я хочу объединить две таблицы, где table1 содержит только 1 запись, а table2 содержит несколько записей с одинаковым идентификатором, но разными серийными номерами.Присоединение на wkid, но я хочу получить только максимальный серийный номер из таблицы 2

SELECT
        t1.wkid
    ,   t1.ser
    ,   t2.nama
    ,   t1.comments
FROM
        table1 t1
    ,   table2 t2
WHERE
        t1.wkid = t2.wkid
    AND t2.ser = MAX(ser)

Создание таблицы и вставки:

create table table1(wkid int, ser int, comments text);
insert into table1 values(721142, 1, 'asdfasd');
insert into table1 values(721142, 2, 'vnivnie');
insert into table1 values(721142, 3, 'el;eklke');
insert into table1 values(721142, 4, 'fefeo');
insert into table1 values(721142, 5, 'jijie');
insert into table1 values(721143, 1, 'my comments 1');
insert into table1 values(721143, 2, 'my comments 2');
insert into table1 values(721143, 3, 'my comments 3');

create table table2(wkid int, nama text);
insert into table2 values(721142, 'John');
insert into table2 values(721143, 'Andy');
insert into table2 values(721144, 'Khan');
insert into table2 values(721145, 'Jack');

Ожидаемый результат:

721142 | 5 | John | jijie
721143 | 3 | Andy | my comments 3

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

Неявное JOIN

SELECT A.wkid, A.ser, B.nama, A.comments
    FROM table1 A, table2 B
    WHERE B.wkid = A.wkid
        AND A.ser = (SELECT max(X.ser) FROM table1 X
                        WHERE X.wkid = A.wkid)

Явное JOIN

SELECT A.wkid, A.ser, B.nama, A.comments
    FROM table1 A JOIN table2 B
    ON B.wkid = A.wkid
    WHERE A.ser = (SELECT max(X.ser) FROM table1 X
                        WHERE X.wkid = A.wkid)
0 голосов
/ 04 июля 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

В этом случае, по иронии судьбы, возможно, лучшее решение использует APPLY, а не JOIN:

SELECT t1.wkid, t2.ser, t2.nama, t1.comments
FROM table1 t1 CROSS APPLY
     (SELECT TOP (1) t2.*
      FROM table2 t2
      WHERE t1.wkid = t2.wkid
      ORDER BY t2.ser DESC
     ) t2;

Это должно эффективно использовать индекс для table2(wkid, ser desc).

0 голосов
/ 04 июля 2019

Вы можете использовать row_number()

ДЕМО

select * from 
(
select t1.wkid, t1.ser, t2.nama, t1.comments, row_number() over(partition by t1.wkid order by ser desc) as rn 
from table1 t1 inner join table2 t2 on t1.wkid = t2.wkid
)A where rn=1 

ВЫХОД:

wkid    ser nama    comments       rn
721142  5   John    jijie           1
721143  3   Andy    my comments 3   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...