Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > SELECT QUERY


Автор: Вася К. 11.10.2005, 10:14
Здраствуйте!

Имееются 3 таблицы:

OBJECTS:
id integer,
name varchar (10)

SECTIONS
id integer,
name varchar (10)

MOVEMENT
from_obj integer,
from_sec integer,
to_obj integer,
to_sec integer


OBJECTS.id связаны с MOVEMENT.from_obj и MOVEMENT.to_obj, аналогично и таблица SECTIONS связана с таблицей MOVEMENT. Как составить запрос выборки из таблицы MOVEMENT, чтоб получился результат в следующем виде:

OBJECTS.NAME (FROM), SECTIONS.NAME (FROM), OBJECTS.NAME (TO), SECTIONS.NAME (TO)


Спасибо!

Автор: Darhazer 11.10.2005, 10:30
Чтото у тебя в таблици нету... например id в MOVEMENT
Если хочеш получить для всех movements from...to то:

Код
 SELECT movements.id, objects.name AS toobject, sections.name as tosection, f.fromobject, f.fromsection
FROM objects, sections, movements, 

  (SELECT movements.id, objects.name AS fromobject, sections.name as fromsection
  FROM objects, sections, movement
  WHERE objects.id = movements. from_obj AND sections.id = movements.from_sec) f

WHERE objects.id = movements. to_obj AND sections.id = movements.to_sec AND movements.id = f.id


Конечно, надо пригодить для синтаксиса твоей БД

Да и не пробувал код, так что можеть имет ошибок

Автор: Вася К. 11.10.2005, 10:57
Если честно, идею не понял..... Поэтому и ошибку в коде найти не смогу. smile
А join - ами это не решить?

Автор: Darhazer 11.10.2005, 11:01
Ну здесь именно неявние join-и

В принципе пишу для PostgreSQL, так что не гарантирую совместимост SQL-а, но принцип такой.

Делаеш запрос

Код
SELECT movements.id, objects.name AS fromobject, sections.name as fromsection
  FROM objects, sections, movement
  WHERE objects.id = movements. from_obj AND sections.id = movements.from_sec


Резултать: Таблица с полям id, fromobject, fromsection
Этой таблици даеш имя f и пользуеш в другом запроса:

Код
SELECT movements.id, objects.name AS toobject, sections.name as tosection, f.fromobject, f.fromsection
FROM objects, sections, movements,  f
WHERE objects.id = movements. to_obj AND sections.id = movements.to_sec AND movements.id = f.id


Так понятнее?

Автор: Вася К. 11.10.2005, 11:13
Чего-то не работает. Ругается на

Код

(SELECT movements.id, objects.name AS fromobject, sections.name as fromsection
  FROM objects, sections, movement
  WHERE objects.id = movements. from_obj AND sections.id = movements.from_sec) f


Говорит, странная штука, этот SELECT на такой-то строке smile . Наверно, нельзя так объявлять таблицу в Interbase 6.5.

Автор: Darhazer 11.10.2005, 11:25
Ок, попробуем по другому:

Код
SELECT movements.id, objects.name AS toobject, sections.name as tosection, f.name AS fromname, f2.name AS fromsection
FROM objects, sections, movements,  objects f, sections f2,
WHERE objects.id = movements.to_obj AND sections.id = movements.to_sec AND f.id = movements.from_obj AND f2.name = movements.from_sec

Автор: Вася К. 11.10.2005, 13:13
Цитата

Ок, попробуем по другому:


SELECT movements.id, objects.name AS toobject, sections.name as tosection, f.name AS fromname, f2.name AS fromsection
FROM objects, sections, movements,  objects f, sections f2,
WHERE objects.id = movements.to_obj AND sections.id = movements.to_sec AND f.id = movements.from_obj AND f2.name = movements.from_sec

- Результат - ни одной записи smile

А почему вот этот код неправильно работает? Логически, помоему, правильно ....

Код

SELECT 
  MOVEMENT.ID,
  OBJECTS.OBJ_NAME,
  SECTIONS.SEC_NAME,
  OBJECTS1.OBJ_NAME,
  SECTIONS1.SEC_NAME
FROM  MOVEMENT
 LEFT JOIN OBJECTS ON (MOVEMENT.ID_FROM_OBJ=OBJECTS.ID)
 LEFT JOIN SECTIONS ON (MOVEMENT.ID_FROM_SEC=SECTIONS.ID)
 LEFT JOIN OBJECTS OBJECTS1 ON (MOVEMENT.ID_TO_OBJ=OBJECTS1.ID)
 LEFT JOIN SECTIONS SECTIONS1 ON (MOVEMENT.ID_TO_SEC=SECTIONS1.ID)



Собсвенно, если бы этот элементарный запрос работал, проблема была бы решена smile

Автор: Darhazer 11.10.2005, 13:43
Цитата
Результат - ни одной записи smile

Конечно не работаеть, в условие вставил .name вместо .id smile

Вот так должен сработать:
Код

 SELECT movements.id, objects.name AS toobject, sections.name as tosection, f.name AS fromname, f2.name AS fromsection
FROM objects, sections, movements,  objects f, sections f2,
WHERE objects.id = movements.to_obj AND sections.id = movements.to_sec AND f.id = movements.from_obj AND f2.id = movements.from_sec

Автор: Вася К. 11.10.2005, 15:02
Усе, иду стреляться. Не работает. Ничего не работает. Целый день коту под хвост.

Автор: Alex 11.10.2005, 16:37
Код проверен и 100% рабочий:
Код

select
    o1.name
  , s1.name
  , o2.name
  , s2.name
from movement mv
left join objects  o1 on mv.from_obj = o1.id
left join objects  o2 on mv.to_obj   = o2.id
left join sections s1 on mv.from_sec = s1.id
left join sections s2 on mv.to_sec   = s2.id


Если не работает, то смотри данные и связи в базе
Добавлено @ 16:39
Код

CREATE TABLE OBJECTS (
    ID    INTEGER NOT NULL,
    NAME  VARCHAR(10)
);

ALTER TABLE OBJECTS ADD CONSTRAINT PK_OBJECTS PRIMARY KEY (ID);

CREATE TABLE SECTIONS (
    ID    INTEGER NOT NULL,
    NAME  VARCHAR(10)
);

ALTER TABLE SECTIONS ADD CONSTRAINT PK_SECTIONS PRIMARY KEY (ID);

CREATE TABLE MOVEMENT (
    ID        INTEGER NOT NULL,
    FROM_OBJ  INTEGER,
    FROM_SEC  INTEGER,
    TO_OBJ    INTEGER,
    TO_SEC    INTEGER
);

ALTER TABLE MOVEMENT ADD CONSTRAINT PK_MOVEMENT PRIMARY KEY (ID);

ALTER TABLE MOVEMENT ADD CONSTRAINT FK_MOVEMENT_FROM_OBJ FOREIGN KEY (FROM_OBJ) REFERENCES OBJECTS (ID) ON UPDATE CASCADE;
ALTER TABLE MOVEMENT ADD CONSTRAINT FK_MOVEMENT_FROM_SEC FOREIGN KEY (FROM_SEC) REFERENCES SECTIONS (ID) ON UPDATE CASCADE;
ALTER TABLE MOVEMENT ADD CONSTRAINT FK_MOVEMENT_TO_OBJ FOREIGN KEY (TO_OBJ) REFERENCES OBJECTS (ID) ON UPDATE CASCADE;
ALTER TABLE MOVEMENT ADD CONSTRAINT FK_MOVEMENT_TO_SEC FOREIGN KEY (TO_SEC) REFERENCES SECTIONS (ID) ON UPDATE CASCADE;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)