Prunik dotazu

Jaroslav Klapalek jaroslav.klapalek na cetos.cz
Středa Prosinec 12 16:48:34 CET 2001


Mohl by me nekdo nakopnout spravnym smerem, mam tento nasedujici problem:

Tabulky:
----------

Mista
    IdcMisto ...  primarni klic
    Oznaceni ....textove oznaceni mista (Praha, Brno, ...) pro problem
nepodstatne

Trasy
    IdcTrasa ... primarni klic
    Oznaceni ... mnemotechnicke oznaceni trasy (napr. Severni na moravu) pro
problem nepodstatne

TrasaDetail
   IdcTrasa
   Poradi
   IdcMisto

Pozadavky
  IdcPozadavek ... primarni klic
  IdcNaklad   ....  polozka slouzi ke seskupeni jednotlivych pozadavku na
prepravu
  IdcMistoOdkud  .... identifikacni císlo mista nakladky
  IdcMistoKam    .....  identifikacni cislo mista vykladky

Napriklad pro topologii mist

               ------ C ---------- D  ----------
A ---- B  <                                          >-----------
G ------------- H
               ------- E ---------- F ------------

Tabulky maji napriklad tyto hodnoty

Mista 1-A, 2-B, 3-C, 4-D, 5-E, 6-F, 7-G, 8-H
Trasy 1 - Horni, 2 - Dolni, 3 - Horní zpět, 4 - Dolní zpět
TrasyDetail    1-1-1,  1-2-2,  1-3-3,  1-4-4,  1-5-7,  1-6-8
                     2-1-1,  2-2-2,  2-3-5,  2-4-6,  2-5-7,  2-6-8
                     3-1-8,  3-2-7,  3-3-4,  3-4-3,  3-5-2,  3-6-1
                     4-1-8,  4-2-7,  4-3-6,  4-4-5,  4-5-2,  4-6-1
Preprava 1 - 1 - 1 - 7, 2 - 1 - 2 - 7, 3 - 1 - 1 - 4, 4 - 1 - 4 - 7


Zjisteni ktere trasy vyhovuji pro prepravu [Odkud] -> [Kam]

SELECT Odkud.IdcTrasa AS IdcTrasa
FROM TrasaDetail AS Odkud INNER JOIN TrasaDetail AS Kam ON Odkud.IdcTrasa =
Kam.IdcTrasa
WHERE ((Odkud.Poradi<Kam.Poradi) AND ((Odkud.IdcMisto)=[Odkud]) AND
((Kam.IdcMisto)=[Kam]));

Takze pro dotaz na trasy z A do G dostanu 1,2;pro B - H dostanu 1,2 pro A -
D dostanu 1, D - G  dostanu 1 atd

Pokud to jeste zabalim pro prepravy  s danou hodnotou [Naklad]

SELECT Pozadavky.IdcPozadavek, Odkud.IdcTrasa
FROM Pozadavky INNER JOIN (TrasaDetail AS Odkud INNER JOIN TrasaDetail AS
Kam ON Odkud.IdcTrasa = Kam.IdcTrasa) ON (Pozadavky.IdcMistoOdkud =
Odkud.IdcMisto) AND (Pozadavky.IdcMistoKam = Kam.IdcMisto)
WHERE ((Odkud.Poradi<Kam.Poradi) AND (Pozadavky.IdcNaklad=[Naklad]))
ORDER BY Pozadavky.IdcPozadavek, Odkud.IdcTrasa;

Tak dostanu

1 - 1, 1 - 2, 2 - 1, 2 - 2, 3 - 1, 4 - 1

ale ja bych rad dostal prunik tras jednotlivych pozadavku tedy pokud by byly
pouze prvni dva pozadavky

tak 1 - 1, 1 - 2, 2 - 1, 2 - 2

ale pro vsechny ctyri pozadavky

1 - 1, 2 - 1, 3 - 1, 4 - 1

Vytazeni pouze spolecnych tras to znamena na zredukovani na seznam v prvnim
pripade 1, 2 v druhem pripade 1 to je pak jiz jednoduche pomoci GROUP BY

SELECT Odkud.IdcTrasa
FROM Pozadavky INNER JOIN (TrasaDetail AS Odkud INNER JOIN TrasaDetail AS
Kam ON Odkud.IdcTrasa = Kam.IdcTrasa) ON (Pozadavky.IdcMistoKam =
Kam.IdcMisto) AND (Pozadavky.IdcMistoOdkud = Odkud.IdcMisto)
WHERE ((Odkud.Poradi<Kam.Poradi) AND (Pozadavky.IdcNaklad=[Naklad]))
GROUP BY Odkud.IdcTrasa
ORDER BY Odkud.IdcTrasa;


Jak na prunik? Nakopnete mne nekdo nejakym smerem. Mne uz nic nenapada

S pozdravem a diky

JardaK

PS: je to uvazovano v SQL Accessu, ale jedna se mi i obecnejsi reseni.
Obecne tras spojujicich mista A a B muze byt n, a totez plati o pozadavcich
prirazenych do nakladu take n.






Další informace o konferenci Databases