Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   запросы в Microsoft Sql Server (http://forum.oszone.net/showthread.php?t=96328)

harusha 18-12-2007 00:15 699022

запросы в Microsoft Sql Server
 
плз помогите с написанием запроса-горит)))
Имеется база данных Железной дороги
CREATE TABLE train (id int not null,
number varchar(255) not null CONSTRAINT number_unique UNIQUE,
)
ALTER TABLE train
ADD PRIMARY KEY (id);


CREATE TABLE place (id int not null PRIMARY KEY,
car int,
seat int ,
train_id int not null);
ALTER TABLE place
ADD FOREIGN KEY (train_id) REFERENCES train;



CREATE TABLE trainstation (train_id int not null ,
station_id int not null,
order_train int not null,
arrival_date datetime,
depature_date datetime )
ALTER TABLE trainstation
ADD PRIMARY KEY (train_id, station_id);
ALTER TABLE trainstation
ADD FOREIGN KEY (train_id) REFERENCES train;
ALTER TABLE trainstation
ADD FOREIGN KEY (station_id) REFERENCES station ;





CREATE TABLE station (id int not null PRIMARY KEY,
name varchar(255)
);


CREATE TABLE price (place_id int not null ,
to_station_id int not null,
from_station_id int not null,
value_price int not null)

ALTER TABLE price
ADD PRIMARY KEY (place_id ,to_station_id ,from_station_id);
ALTER TABLE price
ADD FOREIGN KEY (place_id) REFERENCES place;
ALTER TABLE price
ADD FOREIGN KEY (to_station_id) REFERENCES station;
ALTER TABLE price
ADD FOREIGN KEY (from_station_id) REFERENCES station;




CREATE TABLE saled_place (place_id int not null,
from_station_id int not null,
to_station_id int not null)
ALTER TABLE saled_place
ADD PRIMARY KEY (place_id ,from_station_id,to_station_id);
ALTER TABLE saled_place
ADD FOREIGN KEY (place_id) REFERENCES place;
ALTER TABLE saled_place
ADD FOREIGN KEY (from_station_id) REFERENCES station;
ALTER TABLE saled_place
ADD FOREIGN KEY (to_station_id) REFERENCES station;



Требуется создать запрос выводящий все варианты проезда из пункта А в пункт В (не более чем с одной пересадкой)отсортировать по возрастанию времени необходимого чтобы доехать из А в В

kim-aa 18-12-2007 09:52 699127

harusha,

если вы приведете скриншот логических связей вашей DB, из средств типа erwin, думаю желающих ответить будет больше.
Не думаю что кто-то спит и видит, как разобраться в структуре логических связях чужого запроса на создание.

harusha 18-12-2007 19:34 699527

Вложений: 1
Я последовала вашему совету:-)

kim-aa 19-12-2007 09:23 699729

harusha,
Уже лучше.

При рассмотрении логических связей, не обнаружил всей информации необходимой для описания графа целиком.

Т. е. для каждой станции необходима информация:
- Предыдущая станция
- Последующая станция
- Ветка (как в метро)

Естественно это лучше организовать отдельной таблицей.
И соответственно добавляется Таблица Веток.
Это конечно добавляет избыточности, но упростит запрос.

Пересечения можно выбирать при следующих условиях:
- station-id не уникален
- запрос типа http://forum.oszone.net/thread-95961.html ,

Вполне возможно что пересечения лучше оформить дополнительнойтаблицей Пересечения.
--------------------------------------------------------------------------------------
Мораль такова - чем грамотнее описана структура данных в начале, тем меньше Вы будете "иб@тсо" с запросами в дальнейшем.
Чем кривее структура данных - тем больше секса с кодом.

Принцип сохранения, однако :)

harusha 20-12-2007 01:50 700280

Я это очень хорошо понимаю:-)Но мне надо создать запрос именно с такой схемой:-)
Вот в чем вся проблема

kim-aa 20-12-2007 09:04 700361

harusha,
Значит вы не описали какее-либо граничные условия, которые не видны из Erwin-схемы.
Кстати приличные люди в Erwin вставляют комменты по каждому полю, т. к. базы бывают на порядки больше, а нужно работать а не в "Угадайку" играть.

Вобще у меня есть подозрение что это не практическая задача, а тест.

Т. к. судя по тому что в таблице Trainstation
Цитата:

Цитата harusha
ADD PRIMARY KEY (train_id, station_id); »

т. е. комбинация "станция+поезд" уникальна, чего в живой природе не бывает.

Вобще, понятие "пересадка" подразумевает что через одну станцию ходят несколько поездов и наоборот.

stim4 23-03-2008 14:49 766084

Не буду открывать новую тему а отпишусь здесь:

Наличие:
WinXP Prof SP2
MS SQL 2000 Developers Edition
база с таблицами для менеджеров (не суть важна какая база)

Действие:
с помощью встроеннй утилиты SQL Query Analyzer выполняем запрос типа(вообщем-то не суть важно какой запрос):
Цитата:

begin
set nocount on
create table #FullIndex(
table_name sysname,
index_name sysname,
index_description varchar(210),
index_keys nvarchar(2078)
)

declare @TableName sysname
declare @IndexName sysname
declare @index_keys nvarchar(2078)
declare @sql nvarchar(4000)

declare c cursor for
select
name
from sysobjects
where name like N'tbl_%'
and xtype = N'U'
order by name

open c

while 1 = 1
begin
fetch next from c into @TableName

if @@fetch_status = -1 break
if @@fetch_status = -2 continue

create table #Index(
index_name sysname,
index_description varchar(210),
index_keys nvarchar(2078)
)

insert into #Index
exec sp_helpindex @TableName

insert into #FullIndex (table_name, index_name, index_description, index_keys)
select @TableName, index_name, index_description, index_keys
from #Index

drop table #Index
end
close c
deallocate c

declare c cursor for
select table_name, index_name from #FullIndex
where index_description like '%nonclustered%'
and index_description like '%unique%'
order by table_name

open c

while 1 = 1
begin
fetch next from c into @TableName, @IndexName

if @@fetch_status = -1 break
if @@fetch_status = -2 continue

print N' drop index [' + @TableName + N'].[' + @IndexName + N']'
end
close c
deallocate c


declare c cursor for
select table_name, index_name, index_keys from #FullIndex
where index_description like '%nonclustered%'
and index_description like '%unique%'
order by table_name

open c

while 1 = 1
begin
fetch next from c into @TableName, @IndexName, @index_keys

if @@fetch_status = -1 break
if @@fetch_status = -2 continue

print N' create unique index [' + @IndexName + N'] on [' + @TableName + N'] (' + @index_keys + N') '
end
close c
deallocate c

drop table #FullIndex
set nocount off
end
ожидаем во вкладке"Messages" получить что-то типа:
Цитата:

drop index [tb1_AdminUnit]_[UIX_tbl_AdminUnit_Name]
...
...
create unique index [UIX_tbl_AdminUnit_Name] on [tbl_AdminUnit] (Name, IsGroup)
...
...

ОДНАКО вместо ожидаемой таблицы получаем сообщение:
Цитата:

The command(s) completed succefuly


Замечу что при выполнении простого запроса типа: "select @@version"
--> получаем ожидаемый результат с версией мускуля и всё такое

Вопрос: как мне увидеть ожидаемую таблицу или на худой конец сообщение об ошибке.. а не банальное"The command(s) completed succefuly" ????

Предпринятые меры к исправлению:
привинтил SP4 к MSSQL -- результат тот же..


Время: 03:19.

Время: 03:19.
© OSzone.net 2001-