Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
ВнизПомогите составить запрос Найти похожие ветки
← →
The (2003-11-20 10:52) [0]День добрый
Есть таблица трех полей и данными такого вида
А В С
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 10:57) [1]SELECT * FROM TABLE WHERE A<>B AND C IN(10,11) не подойдет ?
← →
Johnmen (2003-11-20 10:58) [2]>...выбрать все записи, где С in (10, 11), но имеют разное значение по полю А или В.
>
А В С
...
0 0 10
....
Да ? :)
← →
Zacho (2003-11-20 11:01) [3]
> Johnmen © (20.11.03 10:58) [2]
А я и не обратил внимания :)
← →
ZrenBy (2003-11-20 11:02) [4]declare @t table(a int, b int, c int)
insert into @t
select 0, 1, 11 union
select 0, 0, 10 union
select 1, 0, 10 union
select 1, 0, 11 union
select 2, 0, 10 union
select 2, 1, 11 union
select 5, 0, 11 union
select 4, 0, 10 union
select 4, 0, 11 union
select 3, 0, 10
select t.a,t.b,t.c from (
select a,b from @t group by a,b having sum(1)=1
)q inner join @t t on q.a=t.a and q.b=t.b
order by 1,2
← →
ZrenBy (2003-11-20 11:05) [5]where c in (11,10) забыл
← →
sniknik (2003-11-20 11:07) [6]Johnmen © (20.11.03 10:58) [2]
так думаю имелась ввиду в комбинации (A||B), 00 ведь нигде не больше не повторяется.
← →
Johnmen (2003-11-20 11:11) [7]>sniknik © (20.11.03 11:07)
Тогда, наверное, ему достаточно DISTINCT.
← →
The (2003-11-20 11:13) [8]запрос должен быть на Local SQL.
← →
The (2003-11-20 11:25) [9]объясню кратко о самой таблице, а заодно и введу еще одно условие в результатах запроса.
есть база неких документов. один документ может иметь несколько редакций, и состоит из нескольких частей, назовем их статьями. для контроля редакций документа есть таблица содержания документа с полями "Номер статьи", "Версия статьи" и "Номер редакции". Мне нужно показать разницу между двумя редакциями. в результат запроса должны входить статьи, которые имеют разные версии (те, что редактировались) или статьи, которые присутствуют в одной редакции, но отсутствуют в другой. применимо к примеру получается так, что поле А - "Номер статьи", поле В - "Версия статьи" и поле С - "Номер редакции".
← →
sniknik (2003-11-20 11:26) [10]The (20.11.03 11:13) [8]
если отбросить мои догадки, то
Zacho © (20.11.03 10:57) [1]
полное соответствие условию (считать что ошибся в выходных данных а не в описании)
← →
The (2003-11-20 11:32) [11]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) первая статья встречается в неизмененном виде, то есть имеет одинаковую версию. это же очевидно.
← →
The (2003-11-20 11:56) [12]вроде допер.
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)..." ))
← →
Johnmen (2003-11-20 11:59) [13]А причем здесь сцепление строковых значений ???!!!
← →
The (2003-11-20 12:09) [14]не знаю, но так работает
← →
Zacho (2003-11-20 12:12) [15]Если в таблице есть первичный ключ, предположим поле 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:20) [16]первичный ключ составной и состоит из полей А,В,С + еще два поля.
← →
Zacho (2003-11-20 12:23) [17]
> The (20.11.03 12:20) [16]
Ну замени в запросе ID на комбинацию этих полей.
А вообще-то лучше бы сделать искусственный ПК из одного поля, а на естественный наложить UNIQUE CONSTRAINT.
← →
The (2003-11-20 17:38) [18]ошибался я. неверный запрос я составил.
прошу не бить ногами )
← →
Zacho (2003-11-20 18:38) [19]
> 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 18:44) [20]2 Zacho
та то я сгоряча написал, что запрос неправильно работает )
запрос правильно работает, просто хотелось составить такой же, но на любой диапазон по полю С. но так не получиться.
← →
Sandman25 (2003-11-20 18:48) [21]select a, b, max(c)
from t
where c in (10,11)
group by 1,2
?
← →
Zacho (2003-11-20 18:50) [22]
> The (20.11.03 18:44) [20]
Ну а если добавить в WHERE AND T1.C IN (...) ?
← →
Sandman25 (2003-11-20 18:53) [23]Вру.
Zacho прав.
Либо к моему запросу добавить
having count(*)=1
← →
The (2003-11-20 18:54) [24]Ну а если добавить в WHERE AND T1.C IN (...) ?
не получится
← →
Sandman25 (2003-11-20 18:55) [25][24] The (20.11.03 18:54)
А если 2 раза?
← →
Zacho (2003-11-20 18:57) [26]
> The (20.11.03 18:54) [24]
Приведи полностью свой вариант запроса с С IN(..) который не получается. И скази, наконец какая у тебя СУБД и компоненты доступа к данным.
← →
Zacho (2003-11-20 19:19) [27]Вобщем, запрос Sandman25 © (20.11.03 18:48) [21] + Sandman25 © (20.11.03 18:53) [23] - на IB работает, только что проверил из любопытства. В LocalSQL - не знаю, но по идее тоже должен.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.471 c