Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

kako da izvucem podatke iz tri tabele koje nemaju jednak broj zapisa

  • 6 odgovora
  • 4.520 pregleda

Najnovija ↓

kako da izvucem podatke iz tri tabele koje nemaju jednak broj zapisa 13.04.2007. u 11:35 · pre 238 meseci #1
U bazi imam tri tabele

gradovi
polja: id, naziv

regioni
polja: id, naziv


tip_smestaja
polja: id, naziv


potrebno mi je da izvucem sve id i sve nazive u jednom upitu. Probao sam sa left join, right join, i inner join

Code:

SELECT t.id as smestajid, t.naziv as smestajnaziv, g.id as gradid, g.naziv as gradnaziv FROM tip_smestaja t left join gradovi g on t.id = g.id group by t.id


Ovo je primer sa dve tabele i dobijem rezultat ali u tom rezultatu dobijam samo onoliko redova koliko ima u jednoj tabeli, pa ako u tabeli tip_smestaja imam 8 recorda a u tabeli gradovi imam 7 recorda, dobijem 8 rezultata, stim da mi je zadnji record iz tabele gradovi NULL. ukoliko u tabeli gradovi imam 9 recorda, prikaze mi se samo 8 rezultata, a trebalo bi mi svih 9.

Sa tri tabele nisam dobio nista. u trecoj tabeli (regioni) uneo sam samo 2 rekorda, i onda kada sam to nekako pokusao da join ili da union ili bilo sta, dobio bih rezultate koji s eponavljaju onoliko puta koliko ima rekorda. Ne znam sta da radim.
Molim za pomoc, pa ako nisam dobro objasnio pokusacu ponovo da objasnim.
Re: kako da izvucem podatke iz tri tabele koje nemaju jednak broj zapisa 13.04.2007. u 13:20 · pre 238 meseci #2
Znaci ako imamo tabele
Code:

CREATE TABLE gradovi (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

CREATE TABLE regioni (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

CREATE TABLE tip_smestaja (
  id CHAR(5) NOT NULL PRIMARY KEY,
  naziv VARCHAR(30) NOT NULL);

onda je resenje:
Code:

SELECT MAX(CASE WHEN z.tip = 'G'
                THEN z.naziv
                ELSE NULL
            END) AS grad,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.naziv
                ELSE NULL
            END) AS regioni,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.naziv
                ELSE NULL
            END) AS tip_smestaja
  FROM (SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
          FROM gradovi AS g1
               INNER JOIN
               gradovi AS g2
                 ON g1.id >= g2.id
         GROUP BY g1.id, g1.naziv
         UNION ALL
        SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
          FROM regioni AS r1
               INNER JOIN
               regioni AS r2
                 ON r1.id >= r2.id
         GROUP BY r1.id, r1.naziv
         UNION ALL
        SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
          FROM tip_smestaja AS s1
               INNER JOIN
               tip_smestaja AS s2
                 ON s1.id >= s2.id
         GROUP BY s1.id, s1.naziv
       ) AS z
 GROUP BY z.id, z.rbr
 ORDER BY z.rbr
Potpis
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Re: kako da izvucem podatke iz tri tabele koje nemaju jednak broj zapisa 13.04.2007. u 13:58 · pre 238 meseci #5
Znam :) , ali to bi barem sada trebalo da bude lako. Pokusaj.

Napomena: Ako je id integer i ako ne postoje rupe u id-jevima, onda se upit moze uraditi bez kolone 'rbr' (nemoraju se INNER JOIN-ovati tabele same sa sobom), gde ce ulogu kolone 'rbr' zameniti kolona 'id'.
Potpis
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Re: kako da izvucem podatke iz tri tabele koje nemaju jednak broj zapisa 14.04.2007. u 22:00 · pre 238 meseci
izmenjeno 1 put, poslednji put chachka 15.04.2007. u 10:58
  1. chachka15.04.2007. u 10:58zapis iz teksta poruke
#6
Proslo je vise od jednog dana, pa evo i kompletnog resenja:
Code:

SELECT MAX(CASE WHEN z.tip = 'G'
                THEN z.id
                ELSE NULL
            END) AS sifra_grada,
       MAX(CASE WHEN z.tip = 'G'
                THEN z.naziv
                ELSE NULL
            END) AS ime_grada,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.id
                ELSE NULL
            END) AS sifra_regiona,
       MAX(CASE WHEN z.tip = 'R'
                THEN z.naziv
                ELSE NULL
            END) AS ime_regiona,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.id
                ELSE NULL
            END) AS tip_smestaja,
       MAX(CASE WHEN z.tip = 'S'
                THEN z.naziv
                ELSE NULL
            END) AS ime_smestaja
  FROM (SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
          FROM gradovi AS g1
               INNER JOIN
               gradovi AS g2
                 ON g1.id >= g2.id
         GROUP BY g1.id, g1.naziv
         UNION ALL
        SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
          FROM regioni AS r1
               INNER JOIN
               regioni AS r2
                 ON r1.id >= r2.id
         GROUP BY r1.id, r1.naziv
         UNION ALL
        SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
          FROM tip_smestaja AS s1
               INNER JOIN
               tip_smestaja AS s2
                 ON s1.id >= s2.id
         GROUP BY s1.id, s1.naziv
       ) AS z
 GROUP BY z.id, z.rbr
 ORDER BY z.rbr

Ako hocete nesto da naucite iz gornjeg upita pokrenite zasebno podupit:
Code:

SELECT 'G' AS tip, g1.id AS id, g1.naziv AS naziv, COUNT(g2.id) AS rbr
  FROM gradovi AS g1
       INNER JOIN
       gradovi AS g2
         ON g1.id >= g2.id
 GROUP BY g1.id, g1.naziv
 UNION ALL
SELECT 'R' AS tip, r1.id AS id, r1.naziv AS naziv, COUNT(r2.id) AS rbr
  FROM regioni AS r1
       INNER JOIN
       regioni AS r2
         ON r1.id >= r2.id
 GROUP BY r1.id, r1.naziv
 UNION ALL
SELECT 'S' AS tip, s1.id AS id, s1.naziv AS naziv, COUNT(s2.id) AS rbr
  FROM tip_smestaja AS s1
       INNER JOIN
       tip_smestaja AS s2
         ON s1.id >= s2.id
  GROUP BY s1.id, s1.naziv

Kao rezultat smo dobili skup svih gradova, regiona i tipova smestaja. Ovaj skup pored osnovnih informacija sadrzi i informaciju o poreklu (G, R ili S) kao i redni broj numerisan po poreklu.

Spoljni upit grupise ovu pomocnu tabelu i razdvaja njene kolone na vise kolona (CASE deo) u zavisnosti od porekla.

MAX jednostavno uklanja pocetne NULL-ove svake kolone.
Potpis
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme