Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL Запрос [D7, IB6.x]


Страницы:   1 2

Назаров Евгений ©   (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-шники, а надо строки, на которые они ссылаются !


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо