SQL правое соединение, принудительно возвращает только одно значение с правой стороны - PullRequest
1 голос
/ 13 августа 2010
table 1
---
id , name

table2
---
id , activity, datefield

table1 'right join' table2 вернет более 1 результатов из правой таблицы (table2). как сделать так, чтобы он возвращал только «1» результат из таблицы2 с самой высокой датой

Ответы [ 5 ]

3 голосов
/ 13 августа 2010

Вы пишете плохую информацию о своей проблеме, но я попытаюсь привести пример, чтобы помочь вам.

У вас есть таблица "A" и таблица "B", и вам нужно выбрать " top"дата таблицы" B ", связанная с таблицей" A "

Примеры таблиц:

Table A:
 AID| NAME
----|-----
  1 |  Foo
  2 |  Bar

Table B:

BID | AID | DateField
----| ----| ----
 1  |   1 | 2000-01-01
 2  |   1 | 2000-01-02
 3  |   2 | 2000-01-01

ЕслиВы делаете это sql:

SELECT * FROM A RIGHT JOIN B ON B.ID = A.ID

Вы получаете всю информацию о A и B, которая связана по ID (это в этом теоретическом случае является полем, которое является общим для обеих таблиц, чтобы связать отношение)

A.AID | A.NAME | B.BID | B.AID | B.DateField
------|--------|-------|-------|--------------
  1   |   Foo  |   1   |   1   |   2000-01-01
  1   |   Foo  |   2   |   1   |   2000-01-02
  2   |   Bar  |   3   |   2   |   2000-01-01

Но вам требуется только последняя дата для каждого элемента таблицы A (верхняя дата B)

Далее, если вам нужно получить только верхнюю ДАТУ, которую нужно сгруппироватьВаш запрос с помощью B.AID и выборки только на верхнюю дату

SELECT 
      B.AID, First(A.NAME), MAX(B.DateField) 
FROM 
      A RIGHT JOIN B ON B.ID = A.ID 
GROUP BY 
      B.AID

И результат этой операции:

B.AID | A.NAME | B.DateField
------|--------|--------------
  1   |   Foo  |  2000-01-02
  2   |   Bar  |  2000-01-01

В этом результате я удалилнекоторые поля, которые дублируются (например, A.AID и B.AID, которые являются отношениями между двумя таблицами) или не являются обязательными.

  • Совет: это также работает, если у вас есть больше таблиц в sql.Sql «делает» запрос, а затем применяет группировку для использования B, чтобы ограничить количество повторений B верхней датой.
2 голосов
/ 13 августа 2010

правое соединение table2 на table1.id, чтобы выбрать id, max = max (date) из таблицы2

1 голос
/ 13 августа 2010

Analytics!

Тестовые данные:

create table t1
  (id        number       primary key,
   name      varchar2(20) not null
  );

create table t2
  (id        number not null, 
   activity  varchar2(20) not null,
   datefield date not null
  );

insert into t1 values (1, 'foo');
insert into t1 values (2, 'bar');
insert into t1 values (3, 'baz');

insert into t2 values (1, 'foo activity 1', date '2009-01-01');
insert into t2 values (2, 'bar activity 1', date '2009-01-01');
insert into t2 values (2, 'bar activity 2', date '2010-01-01');

Запрос:

select id, name, activity, datefield
  from (select t1.id, t1.name, t2.id as t2_id, t2.activity, t2.datefield,
               max(datefield) over (partition by t1.id) as max_datefield
          from t1
               left join t2 
                 on t1.id = t2.id
       )
 where ( (t2_id is null) or (datefield = maxdatefield) )

Внешнее предложение where отфильтрует все, кромемаксимальная дата из t2-кортежей, но оставить в нулевой строке, где не было подходящей строки в t2.

Результаты:

        ID NAME                ACTIVITY                 DATEFIELD
---------- -------- -------------------       -------------------
         1 foo           foo activity 1       2009-01-01 00:00:00
         2 bar           bar activity 2       2010-01-01 00:00:00
         3 baz
0 голосов
/ 13 августа 2010

Мое решение -

. Выберите из таблицы 1. Правильно соедините таблицу 2 с (table1.id = table2.id и table2.datefiled = (выберите max (поле даты) из table2, где table2.id = table1.id))

0 голосов
/ 13 августа 2010

Чтобы извлечь первые N записей из запроса, вы можете использовать следующий синтаксис:

SELECT *
FROM (your ordered by datefield desc query with join) alias_name
WHERE rownum <= 1
ORDER BY rownum;

PS: я не знаком с PL / SQL, поэтому, возможно, я не прав

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