Уникальные значения строк в запросе

justfb
Дата: 21.06.2012 19:51:57
Здравствуйте!

Есть две таблицы:

1. Headers:
ID bigint
ID_org bigint (FK для таблицы ORG)
Info string
Val integer

2. Org:
ID bigint
Code string
Name string

К примеру заполнены они такими данными:

Headers:
1 - 18 - Head1 - 1
2 - 18 - Head1 - 2
3 - 19 - Test -1
4 - 19 - BadOne - 3

Org:
18 - MyOrg - Organization1
19 - Second - Organization2

Помогите, пожалуйста, написать JOIN запрос для выборки данных вида:

ID (из таблицы Headers) - Info (из таблицы Headers) - Code (из таблицы Org) - Val (из таблицы Headers)
1 - Head1 - MyOrg - 1
3 - Test - Second - 1
4 - BadOne - Second - 3

Т.е. принцип работы следующий : выбрать все значения из таблицы Headers, присоединив к ним данные из таблицы Org. При этом в случае одинаковых значений по всем столбцам (кроме Val) вывести только первую подобную запись (или последнюю - все равно), а остальные проигнорировать.

У меня получилось создать запрос на выборку, но я не знаю, как мне отбросить записи с одинаковыми значениями по всем столбцам, кроме Val.

Заранее спасибо!
Dimitry Sibiryakov
Дата: 21.06.2012 20:10:14

justfb
У меня получилось создать запрос на выборку

Покажи.

Posted via ActualForum NNTP Server 1.5

Ivan_Pisarevsky
Дата: 22.06.2012 00:00:45
justfb
как мне отбросить записи с одинаковыми значениями по всем столбцам, кроме Val.
Use "group by", Luk.
justfb
Дата: 22.06.2012 08:02:57
Запрос на выборку, который уже есть:

SELECT H.ID HEADID, H.DATECREATE, H.DATELOAD, H.DATEACCEPT,
O.ID ID, O.CATELCODE, O.CATELNAME FROM FORMHEADERS H
JOIN ORGANIZATIONS O ON O.ID = ID_ORGANIZATION
WHERE H.PERIOD = :PERIOD


Структура таблиц правда уже изменилась:

1. Organizations (была раньше Org):
ID bigint
CatElCode varchar(255)
CatElName varchar(255)


2. FormHeaders (была раньше Headers):
ID bigint
ID_ORGANIZATION bigint (FK на ORGANIZATIONS)
ID_REPORT bigint (FK на еще одну таблицу)
PERIOD date
FIN integer (раньше был Val)
DATECREATE date
DATELOAD date
DATEACCEPT date


Проблема остается та же. Выбрать нужные значения из FormHeaders и Organizations по заданному параметру PERIOD так, чтобы при возникновении одинаковых записей с разными значениями FIN отбиралась только первая (или последняя). В остальном все также.

По поводу GROUP BY: как я понимаю для использования этого оператора нужно в полях с одинаковыми значениями указывать агрегатные функции. А какие можно использовать в моем случае?
Ivan_Pisarevsky
Дата: 22.06.2012 08:37:15
justfb
По поводу GROUP BY
Все выбираемые поля не упомянутые в кляузе "груп бай" должны быит обернуты агрегатными функциями. Это требование синтаксиса.
justfb
А какие можно использовать в моем случае?

justfb
вывести только первую подобную запись (или последнюю - все равно)
Судя по твоим же словам - любую. хоть min, хоть max.
justfb
Дата: 22.06.2012 09:46:31
Спасибо, большое! Попробую.
pastor
Дата: 22.06.2012 10:01:04
justfb,

1. distinct
select distinct f.RDB$RELATION_NAME, f.RDB$FIELD_NAME  from RDB$RELATION_FIELDS f


2. group by не требует агрегатов
select f.RDB$RELATION_NAME, f.RDB$FIELD_NAME  from RDB$RELATION_FIELDS f group by 1,2
justfb
Дата: 22.06.2012 10:40:17
Всем большое спасибо! Вроде получилось.

Итоговый запрос таким вышел:

SELECT MIN(H.ID) HEADID, H.DATECREATE, H.DATELOAD, H.DATEACCEPT,
MIN(O.ID) ID, O.CATELCODE, O.CATELNAME FROM FORMHEADERS H
JOIN ORGANIZATIONS O ON O.ID = ID_ORGANIZATION
WHERE H.PERIOD = :PERIOD
GROUP BY CATELCODE, DATECREATE, DATELOAD, DATEACCEPT, CATELNAME