Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - SQL - Zobrazenie záznamov podľa podmienky

Mám tabuľky:

Pracovnik.db

ID            autoinc
Meno          varchar(25)
Skryt         boolean

Praca.db

ID            autoinc
Nazov         varchar(25)
Skryt         boolean

Praca_pracovnik.db

ID            autoinc
PRACOVNIK_ID  integer
PRACA_ID      integer
Priorita      integer
Skryt         boolean

Pre tabuľku Praca_pracovnik.db som nastavil toto:

select
*
from
Praca_pracovnik.db, Pracovnik.db, Praca.db
where
Skryt = false
and PRACOVNIK_ID = (Pracovnik.db.ID)
order by
ID

Problém spočíva v tom, že sa mi zobrazia aj záznamy, kde sa PRACOVNIK_ID nerovná Pracovnik.ID a už z toho idem zošedivieť.

Tu je výsledok príkazu:
http://img267.imageshack.us/img267/2881/schrnka01ue 8.gif

Edit 1:
A keď tam dám nasledujúci riadok, tak je výsledok prázdna tabuľka:
and PRACOVNIK_ID = (Pracovnik.db.ID) and PRACA_ID = (Praca.db.ID)

Ak sa nemýlim, malo by mi zobraziť tabuľku Praca_pracovnik, ale miesto ID kódov by malo dosadiť Meno a Nazov (samozrejme, ak nebude za select *, ale len vybrané položky).

Edit 2:
Pre lepšie vysvetlenie:

Nesmie sa rovnať ID a PRACOVNIK_ID, ale PRACOVNIK_ID a ID_1. ID_1 je v skutočnosti Pracovnik.db.ID.

Ak zadám nasledujúci riadok, tak dostanem Invalid field name ID_1:

and PRACOVNIK_ID = (ID_1)
Předmět Autor Datum
Pokud provadis dotaz nad vice tabulkami, musis v tabulce uvadet v pominkach i jmeno tabulky. To jsi…
Jan Fiala 02.03.2007 21:54
Jan Fiala
where Praca_pracovnik.db.Skryt = false and Praca_pracovnik.db.PRACOVNIK_ID = Pracovnik.db.ID Stále…
msx. 03.03.2007 14:05
msx.
Nelibi se mi tam to .db. To je fyzicky nazev tabulky. Dej to pryc. udelal jsi tu podminku jak jsem j…
Jan Fiala 03.03.2007 14:23
Jan Fiala
1. Vyhodil som zo sekcie from tretiu tabuľku. No a výsledok je taký, že opäť mi našlo záznamy, kde P…
msx. 03.03.2007 15:17
msx.
Co ma kontrola souboru společného s SQL dotazem? Pokud dotaz skládáš a chceš am dostat nazvy souborů…
Jan Fiala 03.03.2007 16:53
Jan Fiala
Nemá nič spoločné. Ja som len na začiatku programu testoval fyzickú prítomnosť súborov na disku (tam… poslední
msx. 03.03.2007 21:05
msx.

Pokud provadis dotaz nad vice tabulkami, musis v tabulce uvadet v pominkach i jmeno tabulky. To jsi neudelal.
Dale je vhodne specifikovat pole, ktere ma dotaz vratit. Nema smysl vracet ID ze vsech tabulek, protoze tam budou 2x.

select Pracovnik.Meno, Praca.Nazov, Praca_pracovnik.Priorita
from Praca_pracovnik, Pracovnik, Praca
where Pracovnik.ID = Praca_pracovnik.Pracovnik_ID and
  Praca.ID = Praca_pracovnik.Praca.ID and
  Pracovnik.Skryt = False and
  Praca.Skryt = False and
  Praca_pracovnik.Skryt = False
order by Pracovnik.Meno
where
Praca_pracovnik.db.Skryt = false
and Praca_pracovnik.db.PRACOVNIK_ID = Pracovnik.db.ID

Stále nepomohlo.

A tú hviezdičku za select mám len preto, aby som najprv urobil správnu podmienku. Potom samozrejme vyselektujem správne položky. To už mám aj pripravené, len zapoznámkované - //. Ide o to, že som nechápal, prečo sa to tak správa, tak som zapoznámkoval selektovanie. Po zmene SQL príkazu v časti where mám výsledok ten istý.

1. Vyhodil som zo sekcie from tretiu tabuľku. No a výsledok je taký, že opäť mi našlo záznamy, kde Praca_pracovnik.db.ID = Praca_pracovnik.db.PRACOVNIK_ID.

2. Máš pravdu, problém bol v .db. Odstránil som to zovšadiaľ a ide to. Lenže ja názov s príponou .db využívam aj na kontrolu existencie súborov, takže to budem musieť upraviť a príponu písať ručne. Vyriešené. Ďakujem.

Co ma kontrola souboru společného s SQL dotazem?
Pokud dotaz skládáš a chceš am dostat nazvy souborů z nějakých proměnných, použij funkci
ChangeFileExt(jmeno_s_priponou, '')

Další možnost je (a takto se to obvykle dělá), že použiješ v dotazu aliay tabulek, zvlášť, když máš tak kravsky dlouhá jména tabulek:

select a.* 
from dlouhe_jmeno_tabulky.db a, jeste_delsi_tabulka.db b
where a.ID = b.ID

Ber to jako příklad, pro aliasy bys měl použít nějaké rozumnější jména, zvlášt u komplikovanějších dotazů. Např:

from Pracovnik.db clovek, Praca.db praca, Praca_pracovnik.db spoj

Nemá nič spoločné. Ja som len na začiatku programu testoval fyzickú prítomnosť súborov na disku (tam treba aj príponu). Potom tie isté premenné s názvami som použil na vloženie do SQL príkazu do časti FROM. SQL to zožralo, tak som to nechal tak. Teraz to musím urobiť tak, že príponu budem pridávať navyše pomocou operátora +.

Zpět do poradny Odpovědět na původní otázku Nahoru