![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос SQL [D6, dBase, FoxPro, Paradox]
Merry © (2004-02-02 13:05:00)
помогите, пожалуйста составить запрос, если это можно, который бы из таблицы выбирал только записи с повторяющимися значениями по полям Field1, Field2, т.е. двойников именно по некоторым полям, но не по всем. Пример:
Field1 Field2 Field3
1 Иванов 12 1
2 Петров 1 1
3 Иванов 1 1
4 Иванов 12 1
5 Иванов 6 1
6 Петров 1 1
В данном случае запрос должен брать записи 1,4 и 2, 6.
Merry (2004-02-02 14:02:00) [1]
Вообще-то точки не надо. Я не права.
Merry (2004-02-02 13:57:00) [2]
>Sandman25 © (02.02.04 13:52) [5]
Спасибо огромное, попробую.
А это будет понятно:смена псевдонима таблицы, что t и t1 одно и то же? т.е. там видимо не хватает точки. Правильно так: from t.t1, поэтому то я сразу и не поняла о чем речь.
Sandman25 (2004-02-02 13:54:00) [3]
Упс, опять.
select ...
from t t1
where 1<
(select count(*)
from t
where t1.f1 = f1
and t1.f2 = f2
and t1.f3 = f3
)
Sandman25 (2004-02-02 13:52:00) [4]
t t1 - эта та же самая таблица t, которая в данном подзапросе получает алиас (псевдоним) t1, чтобы можно было ее отличать от t из главного запроса. Для каждой строчки из t эта же таблица t просматривается еще раз, и сравнивается с текущей строчкой из t. Вместо select 1 можно написать что угодно (например, select * или select field1)- exists проверяет только наличие результата.
Иначе говоря, получается нечто типа
for I := 0 to N do
for J := 0 to N
if (T[I].field1 = T[J].field1) and ..
then
break;
Кстати, я ошибся. Надо написать
select ...
from t t1
where 1<
(select count(*)
from t
where t.f1 = f1
and t.f2 = f2
and t.f3 = f3
)
Merry (2004-02-02 13:48:00) [5]
> Sandman25 © (02.02.04 13:12) [1]
> from t t1
Относительно второго запроса: А что это за таблица tt1 и что означает > select 1?
Sandman25 (2004-02-02 13:32:00) [6]
Тогда второй вариант.
Merry (2004-02-02 13:28:00) [7]
> Sandman25 © (02.02.04 13:12) [1]
> having count(*) > 1
По-моему это будет сравнивать все поля в записи, а мне нужно только по двум.
Sandman25 (2004-02-02 13:12:00) [8]
select f1, f2, f3
from t
group by f1, f2, f3
having count(*) > 1
либо
select f1, f2, f3
from t t1
where exists
(select 1
from t
where t.f1 = f1
and t.f2 = f2
and t.f3 = f3
)
Смотря, что надо получить...