![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как выбрать только уникальные записи [D7, FreeBird]
Корешь © (2006-02-16 10:19:00)Есть таблица вида
ID - первичный ключ
ID_LINE
TYPE_RECORD
как одним запросом получить уникальные TYPE_RECORD, Повторюсь уникальные, а не различные disctinct тут не подходит...
Корешь (2006-02-17 14:38:00) [1]
> Johnmen ©
Большое человеское спасибо:)
Корешь (2006-02-17 14:37:00) [2]WHERE
A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B
WHERE B.ID_ACCOUNT = 20 GROUP BY B.ID_DOC_LINE HAVING COUNT(B.ID_ACCOUNT)=1)
AND A.ID_ACCOUNT = 20
Вот так вот работает так как надо
PLAN SORT ((B NATURAL)) PLAN (A NATURAL)
Корешь (2006-02-17 14:32:00) [3]
> Johnmen ©
Проверил, возвращает все записи которые встречаются один раз при условие B.ID_ACCOUNT = 20 , и еще те же записи с другими значениями ID_ACCOUNT...
Johnmen (2006-02-17 11:48:00) [4]
WHERE
A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B WHERE B.ID_ACCOUNT = 20 GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)
Корешь (2006-02-16 17:24:00) [5]
> а ты [1] пробовал?
Пробовал то же самое либо записи которые встречаются один раз в таблице (по полю ID_DOC_LINE ) либо ID_ACCOUNT = 20 :(
Vlad (2006-02-16 15:37:00) [6]
> Корешь (16.02.06 14:51) [15]
а ты [1] пробовал?
Только в условие where добавить a.ID_ACCOUNT = 20 and (... далее по тексту
Корешь (2006-02-16 14:51:00) [7]Попробую прояснить ситуацию. Первоу словие надо отобрать все записи в которых ID_ACCOUNT = 20 из этих записей выбрать только те у в которых значение ID_DOC_LINE встречается только один раз. Видимо придется писать ХП или тащить на клиента все записи удовлетворяющие ID_ACCOUNT = 20 , отсортировать по полю ID_DOC_LINE и в цикле выбирать те что встречаются один раз. Это решение мне не нравится но другого я пока не вижу. Ни у кого других идей нет?
"Нет - значит не было!" (c)
Действительно нет вед если следовать логике приведенного мной запроса первоначально отбираются все записи которые встречаются 1 раз и лишь затем проверяется условие ID_ACCOUNT = 20....
Johnmen (2006-02-16 14:40:00) [8]"Нет - значит не было!" (c)
Корешь (2006-02-16 14:17:00) [9]Следующий запрос действительно возвращает записи в которых значение поля
A.ID_DOC_LINE встречается только один раз...Но если я добавлю еще условия (A.ID_ACCOUNT = 20) то запрос ни чего не возвращает, хотя записи удовлетворяющие данным условиям в таблице есть...
SELECT
A.ID,
A.ID_ACCOUNT,
A.ID_DOC,
A.ID_DOC_LINE,
A.OPER_DATE_TIME,
A."SUM",
A.ANALYTIC_COMPLETION1,
A.ANALYTIC_COMPLETION2,
A.ANALYTIC_COMPLETION3,
TYPE_TRAFFIC,
(SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_NUMBER,
(SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_DATE
FROM
"REG#ACCOUNT_TRANS" A
WHERE
A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)
А этот вариант уже не работает
SELECT
A.ID,
A.ID_ACCOUNT,
A.ID_DOC,
A.ID_DOC_LINE,
A.OPER_DATE_TIME,
A."SUM",
A.ANALYTIC_COMPLETION1,
A.ANALYTIC_COMPLETION2,
A.ANALYTIC_COMPLETION3,
TYPE_TRAFFIC,
(SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_NUMBER,
(SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID =A.ID_DOC_LINE) AS BANK_DOC_DATE
FROM
"REG#ACCOUNT_TRANS" A
WHERE
A.ID_DOC_LINE IN (select ID_DOC_LINE from "REG#ACCOUNT_TRANS" B GROUP BY B.ID_DOC_LINE HAVING COUNT(*)=1)
AND A.ID_ACCOUNT = 20
Корешь (2006-02-16 13:39:00) [10]Вариант в 8 посте ни на что ни ругается и ни чего не возвращает, пробую остальные...
sniknik (2006-02-16 13:06:00) [11]Корешь (16.02.06 12:08) [6]
> ...
> Хочу чтоб запрос возвращал только запись с id 3
SELECT * FROM Table WHERE ID = 3
> Например: "все записии таблицы, значение какого-то поля которой встречается только адын раз".
SELECT * FROM Table
WHERE ID_DOC_LINE IN (
SELECT ID_DOC_LINE FROM Table
GROUP BY ID_DOC_LINE
HAVING COUNT(*)=1)
если конечно синтаксис такой в FB пройдет (в общемто стандартный, должен)
ЮЮ (2006-02-16 12:53:00) [12]Если действительно пофиг, что окажется в остальных полях, но важно, чтобы с определенным значением ID_DOC_LINE в итоговом запросе была только одна запись, то только так:
SELECT
MAX(ac.ID) MaxId,
MAX(ID_ACCOUNT) MaxAccount,
MAX(ID_DOC) MaxDoc,
ID_DOC_LINE,
Max(OPER_DATE_TIME) MaxOperDate,
Max("SUM") MaxSum,
Max((ANALYTIC_COMPLETION1) MaxAC1,
Max(ANALYTIC_COMPLETION2) MaxAC2,
Max(ANALYTIC_COMPLETION3) MaxAC3,
Max(TYPE_TRAFFIC) MaxYraffic,
MAX(doclines.NUMBER_DOC) MaxNumberDoc,
MAX(doclines.DATE_DOC ) MaxDateDoc
FROM
"REG#ACCOUNT_TRANS" acc
JOIN "DOC#BANCK_ORDERING_TAB3" doclinesON doclines.Id = ID =acc.ID_DOC_LINE
WHERE
ID_ACCOUNT = 20
GROUP BY acc.ID_DOC_LINE
ЮЮ (2006-02-16 12:19:00) [13]
> в ID_DOC_LINE могут повторятся
Или встречаться максимум только дважды, один раз с credit, а другой раз с debit ? (так, по-крайней мере в примере)
Danilka (2006-02-16 12:15:00) [14]А по-русски написать не судьба? Например: "все записии таблицы, значение какого-то поля которой встречается только адын раз".
Под это определение попадает [1]. Вот еще вариант:
select * from "REG#ACCOUNT_TRANS" t1
where not exists (select 1 from "REG#ACCOUNT_TRANS" t2 where t1.ID_DOC_LINE = t2.ID_DOC_LINE and t1.id <> t2.id)
ЮЮ (2006-02-16 12:15:00) [15]а
OPER_DATE_TIME,
"SUM",
ANALYTIC_COMPLETION1,
ANALYTIC_COMPLETION2,
ANALYTIC_COMPLETION3,
TYPE_TRAFFIC
из какой записи получить хочешь, если их несколько?
Корешь (2006-02-16 12:08:00) [16]Ни кого я в заблуждение не вводил в таблице записи в ID_DOC_LINE могут повторятся напримеер (таблицу сокращаю)
ID ID_DOC_LINE TYPE_TRAFFIC
1 1 credit
2 1 debit
3 2 credit
4 3 credit
5 3 debit
6 4 credit
7 4 debit
Хочу чтоб запрос возвращал только запись с id 3
Johnmen (2006-02-16 11:53:00) [17]Срочно читать доки по SQL. В частности см. GROUP BY
Но, видимо, в твоём случае надо Vlad © (16.02.06 10:42) [1]
(не надо было вводить в заблуждение словами "получить уникальные TYPE_RECORD")
ЮЮ (2006-02-16 11:52:00) [18]убери GROUP BY ID_DOC_LINE и расскажи, что такое "уникальность", для которй Distinct не подходит
Корешь (2006-02-16 11:48:00) [19]Вот полный текст запроса который у меня получился
SELECT
ID,
ID_ACCOUNT,
ID_DOC,
ID_DOC_LINE,
OPER_DATE_TIME,
"SUM",
ANALYTIC_COMPLETION1,
ANALYTIC_COMPLETION2,
ANALYTIC_COMPLETION3,
TYPE_TRAFFIC,
(SELECT NUMBER_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID ="REG#ACCOUNT_TRANS".ID_DOC_LINE) AS BANK_DOC_NUMBER,
(SELECT DATE_DOC FROM "DOC#BANCK_ORDERING_TAB3"
WHERE ID ="REG#ACCOUNT_TRANS".ID_DOC_LINE) AS BANK_DOC_DATE
FROM
"REG#ACCOUNT_TRANS"
WHERE
ID_ACCOUNT = 20
GROUP BY ID_DOC_LINE
HAVING COUNT(*)=1
Грязно ругается: Invalid token.Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Johnmen (2006-02-16 10:58:00) [20]SELECT TYPE_RECORD FROM Table
GROUP BY TYPE_RECORD
HAVING COUNT(*)=1