Создать запрос SQL для извлечения данных из двух таблиц - PullRequest
2 голосов
/ 15 января 2010

У меня есть две таблицы:

T_STOCK: первичный ключ - id, seller, а в некоторых других полях можно указать a и b. T_FLOW: первичным ключом является (id + startdate) и некоторые другие поля, например c и d.

Я хочу запрос, который возвращает все столбцы для каждой записи из T_STOCK относительно определенного seller, но завершается столбцами (startDate, c и d) из таблицы T_FLOW .

Отношение между T_STOCK и T_FLOW основано на атрибуте id. Каждый раз, когда в T_STOCK существует запись с определенным идентификатором, для этого идентификатора существует как минимум одна запись в T_FLOW.

Однако может случиться так, что в T_FLOW существует более одной записи. В этом случае я должен рассмотреть только самый последний (то есть тот, у которого max(startDate)).

Другими словами, если у нас есть содержимое следующих таблиц:

+---------------------+
|       T_STOCK       |
+----+--------+---+---+
| ID | SELLER | a | b |
+----+--------+---+---+
| 01 | foobar | 1 | 2 |
+----+--------+---+---+
| 02 | foobar | 3 | 4 |
+----+--------+---+---+
| 03 | foobar | 5 | 6 |
+----+--------+---+---+

+---------------------------+
|           T_FLOW          |
+----+------------+----+----+
| ID |  StartDate |  c |  d |
+----+------------+----+----+
| 01 | 01/01/2010 |  7 |  8 |
+----+------------+----+----+
| 02 | 01/01/2010 |  9 | 10 |
+----+------------+----+----+
| 02 | 07/01/2010 | 11 | 12 |
+----+------------+----+----+
| 03 | 03/01/2010 | 13 | 14 |
+----+------------+----+----+
| 03 | 05/01/2010 | 15 | 16 |
+----+------------+----+----+

Результат запроса должен быть:

+----+--------+---+---+------------+----+----+
| ID | SELLER | a | b |  startDate |  c |  d |
+----+--------+---+---+------------+----+----+
| 01 | foobar | 1 | 2 | 01/01/2010 |  7 |  8 |
+----+--------+---+---+------------+----+----+
| 02 | foobar | 3 | 4 | 03/01/2010 | 11 | 12 |
+----+--------+---+---+------------+----+----+
| 03 | foobar | 5 | 6 | 01/01/2010 | 15 | 16 |
+----+--------+---+---+------------+----+----+

Как мне тогда написать свой запрос?

Ответы [ 4 ]

3 голосов
/ 15 января 2010
SELECT  *
FROM    t_stock s
JOIN    (
        SELECT  f.*, ROW_NUMBER() OVER (PARTITION BY id ORDER BY startDate DESC) AS rn
        FROM    t_flow f
        ) f
ON      f.id = s.id
        AND f.rn = 1

Вот решение, которое не использует аналитические функции:

SELECT  *
FROM    t_stock s
JOIN    t_flow f
ON      (f.id, f.startDate) =
        (
        SELECT  id, MAX(startDate)
        FROM    t_flow fi
        WHERE   fi.id = s.id
        GROUP BY
                id
        )
1 голос
/ 15 января 2010

Вы получаете самую последнюю запись T_FLOW, используя аналитику, , как показано Кассной , или используя:

select id, max(startdate) last_start_date from t_flow group by id;

Затем вы можете присоединиться к этому с вашей таблицей T_STOCK - что-то вроде:

select
    s.*,
    f.*
from
    t_stock s
        inner join t_flow f on
                f.id = s.id
            and (f.id, f.startdate) in
                (
                select
                    id,
                    max(startdate) laststartdate
                from
                    t_flow
                group by
                    id
                )
0 голосов
/ 26 октября 2012
select id, max(startdate) last_start_date from t_flow group by id;

Затем вы можете присоединиться к этому со своей T_STOCK таблицей, примерно так:

select s.*, f.* from t_stock s inner join t_flow f on f.id = s.id
and (f.id, f.startdate) in (select id, max(startdate) laststartdate
                from t_flow group by id)
0 голосов
/ 15 января 2010
SELECT  DISTINCT
        s.*
       ,FIRST_VALUE(f.startdate)
        OVER (PARTITION BY f.id ORDER BY f.startdate DESC) startdate
       ,FIRST_VALUE(f.c)
        OVER (PARTITION BY f.id ORDER BY f.startdate DESC) c
       ,FIRST_VALUE(f.d)
        OVER (PARTITION BY f.id ORDER BY f.startdate DESC) d
FROM    t_stock s, t_flow f
WHERE   f.id = s.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...