![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL Запрос [D7, IB6.x]
Назаров Евгений © (2004-04-12 11:54:00)Подскажите плиз, как оптимально сделать запрос, который получает список строк по их индексам? то есть есть таблица
A:
id,p1,p2,p3,p4,p5 (p- указатели на id строк в другой таблице B)
B:
idp,name
короче надо получить по id набор строк из таблицы B
и желательно, чтобы работало как можно быстрее, так как параметров на самом деле 10 , а строк в таблице А-12000
заранее спасибо
serge35 (2004-04-14 12:04:00) [1]Надо было задавать вопросы до проектирования таблиц.
Не надо никогда скупиться на таблицы и на количество полей в таблицах.
Надо было сделать таблицу А и для кождого поля р сделать другую таблицу. т.е.
р1 ссылается на таблицу В, р2 на таблицу С, р3 на таблицу D и т.д.
Тогда был бы очень красивый запрос
select * from a, b, c, d
where a.p1=b.id
and a.p2=c.id
and a.p3=d.id
И работал бы он в несколко раз быстрее!
Назаров Евгений (2004-04-14 11:55:00) [2]constraint PK_C primary key (A, B),
constraint FK_C_A foreign key (A) references A(ID),
constraint FK_C_B foreign key (B) references B(ID)
подскажите пожалуйста, на сколько ускоряют эти строки работу ??
и подскажите , где можно почитать про индексы (как они создаются, на сколько ускоряют работу ), до сей момента никогда не пользовался ими, так как база была маленькая, скорости хватало...
Fay (2004-04-13 20:42:00) [3]
creare table B(
id integer not null,
name varchar(100) not null collate win1251,
constraint PK_B primary key (ID)
);
creare table A(
id integer not null,
name varchar(100) not null collate win1251,
constraint PK_A primary key (ID)
);
creare table C(
A integer not null,
B integer not null,
constraint PK_C primary key (A, B),
constraint FK_C_A foreign key (A) references A(ID),
constraint FK_C_B foreign key (B) references B(ID)
);
select
B.*
from B, C
where
B.ID = C.B
and C.A = 10
Назаров Евгений (2004-04-13 15:53:00) [4]я :) - а как было бы лучше ?
serge35 (2004-04-13 15:09:00) [5]Никак.
Скажи спасибо тому, кто так таблицы спроектировал.
Назаров Евгений (2004-04-13 14:31:00) [6]так тоже не канает, но я сам сделал
вот что надо было:
select b1.name,b2.name,b3.name
from cat a, cat_parse b1, cat_parse b2, cat_parse b3
where a.p1=b1.id
and a.p2=b2.id
and a.p3=b3.id
and a.id=9750;
но это жуть неудобно, так как параметров на самом деле 10 штук (p1,p2-p10)
как бы это сделать через оператор in ?
serge35 (2004-04-13 14:11:00) [7]или так
select *
from a, b
where a.p1=b.id
and b.id=11
UNION
select *
from a, b
where a.p2=b.id
and b.id=11
UNION
select *
from a, b
where a.p3=b.id
and b.id=11
serge35 (2004-04-13 14:09:00) [8]> известному id из таблицы А(например 11) выбрать соответствующие данные
Как это понимать?
попробуй наоборот
select *
from a a1, a a2, a.3, b
where a1.p1=b.id
and a2.p2=b.id
and a3.p3=b.id
and b.id=11
Назаров Евгений (2004-04-13 14:03:00) [9]>sergey35
ну я не знаю, хоть ползком :)) ну не работает !
a.id и b.id это разные вещи !
на b.id указывают цифры в полях a.p1 a.p2 a.p4
serge35 (2004-04-13 13:51:00) [10]При определенной физической подготовке вполне нормально.
Johnmen (2004-04-13 13:48:00) [11]>Назаров Евгений
Я понимаю, тяжело в лыжах по асфальту...
:)
serge35 (2004-04-13 13:46:00) [12]sorry
select a.id,a.p1,a.p2,a.p3,b.id,b.name
from a, b
where a.id=b.id
and a.id=11
serge35 (2004-04-13 13:44:00) [13]select id, p1,p2,p3, name
from b
where b.id=11
Назаров Евгений (2004-04-13 13:40:00) [14]так он выбирает всё, а надо только из одной строки, например по ID=11, выбираются p1 p2 p3 = 4 2 5, и по ним строки из таблицы В
2000+, Anhlon, Box
Johnmen (2004-04-13 13:23:00) [15]
SELECT * FROM A
LEFT JOIN B ON A.p1=B.id
LEFT JOIN B ON A.p2=B.id
LEFT JOIN B ON A.p3=B.id
...
Назаров Евгений (2004-04-13 13:11:00) [16]Нужны строки из таблицы B , поле NAME:
пример:
Таблица А / Таблица B
id p1 p2 p3 / id Name
11 4 2 5 / 2 'Athlon'
12 1 3 2 / 3 'Palomino'
и т.д... / 4 '2000+'
/ 5 'Box'
Нужно, чтобы по известному id из таблицы А(например 11) выбрать соответствующие данные 2000+, Anhlon, Box
serge35 (2004-04-12 13:08:00) [17]А строки из какой таблицы нужны?
serge35 (2004-04-12 13:07:00) [18]Ну и...
У тебя теперь есть все id .
select * from a
where a.id in
(select id
from a, b b1, b b2, b b3
where a.p1=b1.idp, a.p2=b2.idp, a.p3=b3.idp)
Johnmen (2004-04-12 13:04:00) [19]В [1] посте уже ответили.
В чем проблема ? ВSELECT *?
Назаров Евгений (2004-04-12 12:55:00) [20]в первом случае он просто выбирает id-шники, а надо строки, на которые они ссылаются !