Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Logika


Автор: natik209 26.5.2007, 21:13
Помагите решить задачу
Предсавим себедома всего 9 росполошины по 3 вот так
Точки это перекрестки
1     2     3
   .       .
4     5     6
   .       .
7     8     9

Нужна создать таблицу и запрос исползуя толко SQL.
Цель 
Нужна узнать какие дома находится нахадась на перекрестке и нужна знать повернув на лево какие дома находится перед вами или  на прова. При этом незная последователность перекрестков.Мне сказали что там болше двух столбцов.структура таблицы прпоизволная.

Добавлено @ 21:14
Pomagite pojalusta vopros jizni i smerti plizzzzzzzz

Автор: chief39 26.5.2007, 23:20
А) Есть такая галочка "Транслит" под смайлами
Б) Ничего не понятно smile Давай заново и подробнее

Автор: LSD 26.5.2007, 23:56
Какова структура таблиц?

Автор: SergKO 28.5.2007, 06:40
Слабо понятно.
Но можно предположить, что-то типа построения графа. 
В простейшем случае:
1. Имеем список домов (адресов) с уникальными идентификаторами.
2. Дома по улице имеют непосредственные связи с домом слева и с домом справа, а дома на перекрестке имеют больше связей.
3. Создаем таблицу связей, в которой имеем в одной записи идентификаторы двух непосредственно связанных домов, т.е. если дом №2 непосредственно "соприкасается" с домами №1 и №3, то будем иметь две записи:
1-2
2-3
3. Дом на перекрестке будет иметь больше записей о связях.

Повторяю - это простейший случай. Не учитывается, что улица имеет четную и нечетную сторну и многое, многое другое. Но, я думаю, смысл понятен.

Автор: SergKO 28.5.2007, 12:37
natik209, желательно задавать вопросы не за один день до зачета. Сюда выкладываю потому, что в спешке мог допустить ошибку. Тогда кто-нибудь заметит и м.б. подправит.

Код

declare @Adr table (Id1 int, Adress varchar(50));
declare @Rel table (Adr1 int, Adr2 int);

    -- Заполнение тестовой табличной переменной (таблица в памяти)
    -- идентификаторами адресов и самими адресами
    insert into @Adr
        select 1, 'Улица 1, Дом 1'
        union all
        select 2, 'Улица 1, Дом 2'
        union all
        select 3, 'Улица 1, Дом 3'
        union all
        select 4, 'Улица 1, Дом 4'
        union all
        select 5, 'Улица 2, Дом 1'
        union all
        select 6, 'Улица 2, Дом 2'
        union all
        select 7, 'Улица 2, Дом 3'
        union all
        select 8, 'Улица 2, Дом 4'

    -- Заполнение таблицы связей.
    -- Предположим, что перекресток между 
    -- "Улица 1, Дом 2"(Id1 = 2), "Улица 1, Дом 3"(Id1 = 3) и "Улица 2, Дом 1"(Id1 = 5), "Улица 2, Дом 2"(Id1 = 6)
    insert into @Rel
        select 1, 2
        union all
        select 2, 3
        union all
        select 3, 4
        union all
        select 5, 6
        union all
        select 6, 7
        union all
        select 7, 8
        -- дальше заполнение связей на пересечении
        union all
        select 2, 5
        union all
        select 3, 5
        union all
        select 3, 6
        union all
        select 2, 6

        -- Переменная для указания идентификатора адреса, для которого будем производить поиск
declare    @AdrId    int;

        -- Присваиваем значение 2, т.е. идентификатор для 'Улица 1, Дом 2' (дом на перекрестке)
        select @AdrId = 2;

        select distinct a.Adress
        from @Rel r
            inner join @Adr a on a.Id1 = r.Adr1 or a.Id1 = r.Adr2
        where r.Adr1 = @AdrId OR r.Adr2 = @AdrId;
        
        -- Если количество обработанных строк больше 2, то дом стоит на перекрестке
        if @@ROWCOUNT > 2
            print 'Перекресток';
        else
            print 'Не перекресток';


Автор: natik209 28.5.2007, 14:01
Net ne  podxodut nujna ispolzavat tolko SQL a v SQL net if
Pojalusta pomagite 

Автор: SergKO 28.5.2007, 15:44
1. А на чем по Вашему был написан скрипт? М.б. на плюсах или на шарпе?  smile
2. Удалите строки 
Код

        -- Если количество обработанных строк больше 2, то дом стоит на перекрестке
        if @@ROWCOUNT > 2
            print 'Перекресток';
        else
            print 'Не перекресток'; 
 
 и будет без if.
3. Когда задаете вопрос, то сразу оговаривайте диалект.
4. Так пойдет?
Код

-- Предположим, что ранее созданы таблицы
-- Adr - адреса:
--              Id1 int - уникальный идентификатор адреса,
--              Adress varchar(50) - собственно адрес.
--Rel - связи между соседними домами (адресами)
--             Adr1 int - идентификатор первого адреса,
--             Adr2 int - идентификатор второго адреса

    -- Заполнение тестовой табличной переменной (таблица в памяти)
    -- идентификаторами адресов и самими адресами
    insert into Adr (Id1, Adress)
        select 1, 'Улица 1, Дом 1'
        union all
        select 2, 'Улица 1, Дом 2'
        union all
        select 3, 'Улица 1, Дом 3'
        union all
        select 4, 'Улица 1, Дом 4'
        union all
        select 5, 'Улица 2, Дом 1'
        union all
        select 6, 'Улица 2, Дом 2'
        union all
        select 7, 'Улица 2, Дом 3'
        union all
        select 8, 'Улица 2, Дом 4'

    -- Заполнение таблицы связей.
    -- Предположим, что перекресток между 
    -- "Улица 1, Дом 2"(Id1 = 2), "Улица 1, Дом 3"(Id1 = 3) и "Улица 2, Дом 1"(Id1 = 5), "Улица 2, Дом 2"(Id1 = 6)
    insert into Rel (Adr1, Adr2)
        select 1, 2
        union all
        select 2, 3
        union all
        select 3, 4
        union all
        select 5, 6
        union all
        select 6, 7
        union all
        select 7, 8
        -- дальше заполнение связей на пересечении
        union all
        select 2, 5
        union all
        select 3, 5
        union all
        select 3, 6
        union all
        select 2, 6

        select distinct a.Adress
        from Rel r
            inner join Adr a on a.Id1 = r.Adr1 or a.Id1 = r.Adr2
        where r.Adr1 = 2 OR r.Adr2 = 2 -- 2 - идентификатора адреса, для которого будем производить поиск


Автор: natik209 28.5.2007, 22:27
Sposiba boljoye tebe SergKO  ti spas mena  ogromnoye tebe sposiba smile  smile  smile  smile 

Автор: natik209 29.5.2007, 20:33
net ya pokazal skazali ojibka napiji skype pogovarim konkretna najot zadaci

Автор: LSD 29.5.2007, 23:42
natik209, последнее предупреждение, если продолжишь писать транслитом я закрою тему!

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