Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

SQL Запрос   Найти похожие ветки 

 
Назаров Евгений   (2004-04-12 11:54) [0]

Подскажите плиз, как оптимально сделать запрос, который получает список строк по их индексам? то есть есть таблица
A:
id,p1,p2,p3,p4,p5 (p- указатели на id строк в другой таблице B)
B:
idp,name

короче надо получить по id набор строк из таблицы B
и желательно, чтобы работало как можно быстрее, так как параметров на самом деле 10 , а строк в таблице А-12000

заранее спасибо


 
serge35   (2004-04-12 12:10) [1]

Для каждого поля из таблицы А надо вводить новую таблицу В.

select id, p1,p2,p3
from a, b b1, b b2, b b3
where a.p1=b1.idp, a.p2=b2.idp, a.p3=b3.idp

попробуй так.


 
serge35   (2004-04-12 12:11) [2]

Если не покатит, то через UNION.


 
Назаров Евгений   (2004-04-12 12:55) [3]

в первом случае он просто выбирает id-шники, а надо строки, на которые они ссылаются !


 
Johnmen ©   (2004-04-12 13:04) [4]

В [1] посте уже ответили.
В чем проблема ? В SELECT * ?


 
serge35   (2004-04-12 13:07) [5]

Ну и...
У тебя теперь есть все 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)


 
serge35   (2004-04-12 13:08) [6]

А строки из какой таблицы нужны?


 
Назаров Евгений   (2004-04-13 13:11) [7]

Нужны строки из таблицы 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


 
Johnmen ©   (2004-04-13 13:23) [8]

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:40) [9]

так он выбирает всё, а надо только из одной строки, например по ID=11, выбираются p1 p2 p3 = 4 2 5, и по ним строки из таблицы В
2000+, Anhlon, Box


 
serge35   (2004-04-13 13:44) [10]

select id, p1,p2,p3, name
from b
where b.id=11


 
serge35   (2004-04-13 13:46) [11]

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


 
Johnmen ©   (2004-04-13 13:48) [12]

>Назаров Евгений

Я понимаю, тяжело в лыжах по асфальту...
:)


 
serge35   (2004-04-13 13:51) [13]

При определенной физической подготовке вполне нормально.


 
Назаров Евгений   (2004-04-13 14:03) [14]

>sergey35
ну я не знаю, хоть ползком :)) ну не работает !
a.id  и  b.id это разные вещи !
на b.id указывают цифры в полях a.p1 a.p2 a.p4


 
serge35   (2004-04-13 14:09) [15]

> известному 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


 
serge35   (2004-04-13 14:11) [16]

или так

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


 
Назаров Евгений   (2004-04-13 14:31) [17]

так тоже не канает, но я сам сделал
вот что надо было:
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 15:09) [18]

Никак.
Скажи спасибо тому, кто так таблицы спроектировал.


 
Назаров Евгений   (2004-04-13 15:53) [19]

я :)  - а как было бы лучше ?


 
Fay ©   (2004-04-13 20:42) [20]

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-14 11:55) [21]

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)

подскажите пожалуйста, на сколько ускоряют эти строки работу ??
и подскажите , где можно почитать про индексы (как они создаются, на сколько ускоряют работу ), до сей момента никогда не пользовался ими, так как база была маленькая, скорости хватало...


 
serge35   (2004-04-14 12:04) [22]

Надо было задавать вопросы до проектирования таблиц.
Не надо никогда скупиться на таблицы и на количество полей в таблицах.
Надо было сделать таблицу А и для кождого поля р сделать другую таблицу. т.е.
р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

И работал бы он в несколко раз быстрее!



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
7-1079955956
compic
2004-03-22 14:45
2004.04.11
Обновление программы из под пользователя


9-1071308489
SliderCrash
2003-12-13 12:41
2004.04.11
Как взять палитру из загружаемого bmp (8bit)?


3-1079386235
dfg
2004-03-16 00:30
2004.04.11
DBComboBox показывает только одну строку


1-1080123251
an-na2002
2004-03-24 13:14
2004.04.11
TEdit точка запятая


1-1080271880
Хэтч
2004-03-26 06:31
2004.04.11
Хочу, чтобы форма при Maximize пропорционально увеличивалась...