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 Test