![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить запрос
The © (2003-11-20 10:52:00)
День добрый
Есть таблица трех полей и данными такого вида
А В С
0 1 11
0 0 10
1 0 10
1 0 11
2 0 10
2 1 11
5 0 11
4 0 10
4 0 11
3 0 10
.. .. ..
с этой таблицы нужно выбрать те записи, которые имеют разное значение или по полю А, или по полю В, но при этом входят в определенный диапазон по полю С. Например, мне нужно выбрать все записи, где С in (10, 11), но имеют разное значение по полю А или В. В результате должен получить такую выборку:
А В С
0 1 11
0 0 10
2 0 10
2 1 10
5 0 11
3 0 10
.. .. ..
Zacho (2003-11-20 19:19:00) [1]
Вобщем, запрос Sandman25 © (20.11.03 18:48) [21] + Sandman25 © (20.11.03 18:53) [23] - на IB работает, только что проверил из любопытства. В LocalSQL - не знаю, но по идее тоже должен.
Zacho (2003-11-20 18:57:00) [2]
> The (20.11.03 18:54) [24]
Приведи полностью свой вариант запроса с С IN(..) который не получается. И скази, наконец какая у тебя СУБД и компоненты доступа к данным.
Sandman25 (2003-11-20 18:55:00) [3]
[24] The (20.11.03 18:54)
А если 2 раза?
The (2003-11-20 18:54:00) [4]
Ну а если добавить в WHERE AND T1.C IN (...) ?
не получится
Sandman25 (2003-11-20 18:53:00) [5]
Вру.
Zacho прав.
Либо к моему запросу добавить
having count(*)=1
Zacho (2003-11-20 18:50:00) [6]
> The (20.11.03 18:44) [20]
Ну а если добавить в WHERE AND T1.C IN (...) ?
Sandman25 (2003-11-20 18:48:00) [7]
select a, b, max(c)
from t
where c in (10,11)
group by 1,2
?
The (2003-11-20 18:44:00) [8]
2 Zacho
та то я сгоряча написал, что запрос неправильно работает )
запрос правильно работает, просто хотелось составить такой же, но на любой диапазон по полю С. но так не получиться.
Zacho (2003-11-20 18:38:00) [9]
> The (20.11.03 17:38) [18]
А за что бить-то ? :)
Посмотри на запрос Zacho © (20.11.03 12:12) [15]. Замени в нем T1.ID <> T2.ID на (T1.A<>T2.A AND T1.B<>T2.B AND ... ), вобщем поле ID на поля входяшие в состав твоего ПК.
Честно говоря, не знаю, как в LocalSQL, а в IB этот запрос работает правильно, и синтаксису SQL92 вроде бы полностью соответствует.
The (2003-11-20 17:38:00) [10]
ошибался я. неверный запрос я составил.
прошу не бить ногами )
Zacho (2003-11-20 12:23:00) [11]
> The (20.11.03 12:20) [16]
Ну замени в запросе ID на комбинацию этих полей.
А вообще-то лучше бы сделать искусственный ПК из одного поля, а на естественный наложить UNIQUE CONSTRAINT.
The (2003-11-20 12:20:00) [12]
первичный ключ составной и состоит из полей А,В,С + еще два поля.
Zacho (2003-11-20 12:12:00) [13]
Если в таблице есть первичный ключ, предположим поле ID, то вот вариант:
SELECT * FROM T T1
WHERE NOT EXISTS
(SELECT A FROM T T2
WHERE T1.A = T2.A AND T1.B = T2.B AND
T1.ID <> T2.ID)
The (2003-11-20 12:09:00) [14]
не знаю, но так работает
Johnmen (2003-11-20 11:59:00) [15]
А причем здесь сцепление строковых значений ???!!!
The (2003-11-20 11:56:00) [16]
вроде допер.
select z1.A, z1.B, z1.C
from table z1
where C in (10, 11)
and 1=(select count(z2.A||z2.B)
from table z2
where C in (10, 11)
and z1.A=z2.A and z1.B=z2.B)
group by z1.A, z1.C, z1.B
спасибо sniknik за "...комбинации (A||B)..." ))
The (2003-11-20 11:32:00) [17]
2 sniknik
позвольте возразить. при таких данных:
А В С
1 0 10
1 0 11
.. .. ..
SELECT * FROM TABLE WHERE A<>B AND C IN(10,11)
выдаст мне
А В С
1 0 10
1 0 11
.. .. ..
а это неправильно, так как в этих двух редакциях (10, 11) первая статья встречается в неизмененном виде, то есть имеет одинаковую версию. это же очевидно.
sniknik (2003-11-20 11:26:00) [18]
The (20.11.03 11:13) [8]
если отбросить мои догадки, то
Zacho © (20.11.03 10:57) [1]
полное соответствие условию (считать что ошибся в выходных данных а не в описании)
The (2003-11-20 11:25:00) [19]
объясню кратко о самой таблице, а заодно и введу еще одно условие в результатах запроса.
есть база неких документов. один документ может иметь несколько редакций, и состоит из нескольких частей, назовем их статьями. для контроля редакций документа есть таблица содержания документа с полями "Номер статьи", "Версия статьи" и "Номер редакции". Мне нужно показать разницу между двумя редакциями. в результат запроса должны входить статьи, которые имеют разные версии (те, что редактировались) или статьи, которые присутствуют в одной редакции, но отсутствуют в другой. применимо к примеру получается так, что поле А - "Номер статьи", поле В - "Версия статьи" и поле С - "Номер редакции".
The (2003-11-20 11:13:00) [20]
запрос должен быть на Local SQL.