Question

I use generalisation/specialize table Zadavatel (which contains primary key) as either table Sukromna_osoba or Firma (both contains foreign key that points on Zadavatel). I need to select Sukromna_osoba table if Sukromna_osoba.meno = 'string' exists or Firma table if Firma.nazov_firmy = 'string' exists, both if both conditions are true. I also need this to be in one select.

CREATE TABLE Zadavatel (
id_zadavatela  INTEGER,
adresa VARCHAR(25)
); 

CREATE TABLE Sukromna_osoba (
id_sukromnej_osoby  INTEGER,
meno VARCHAR(20),
mobil  INTEGER,
email VARCHAR(20)
); 

CREATE TABLE Firma (
id_firmy  INTEGER,
nazov_firmy VARCHAR(20),
ico  INTEGER,
bankove_spojenie INTEGER
);

id_zadavatela is primary key, and id_sukromnej_osoby and id_firmy are foreign keys which points at id_zadavatela.

I tried something like this:

SELECT PR.id_projektu, PR.popis, ZAD.id_zadavatela, FI.nazov_firmy
    FROM Projekt PR JOIN Zamestnanec ZAM ON PR.manazer = ZAM.osobne_cislo
    JOIN Zadavatel ZAD ON PR.zadavatel = ZAD.id_zadavatela
    JOIN Firma FI ON ZAD.id_zadavatela = FI.id_firmy
WHERE ZAM.meno = 'Jan Novák' OR (
    SELECT PR1.id_projektu, PR1.popis, ZAD1.id_zadavatela, SO1.meno
    FROM Projekt PR1 JOIN Zamestnanec ZAM1 ON PR1.manazer = ZAM1.osobne_cislo
    JOIN Zadavatel ZAD1 ON PR1.zadavatel = ZAD1.id_zadavatela
    JOIN Sukromna_osoba SO1 ON ZAD1.id_zadavatela = SO1.id_sukromnej_osoby
    WHERE ZAM1.meno = 'Jan Novák'
)
Was it helpful?

Solution

Since you do not know if it's a firm or a person, you could use left outer join on both, like this:

SELECT PR.id_projektu, PR.popis, ZAD.id_zadavatela, FI.nazov_firmy, SO.meno
FROM Projekt PR
JOIN Zamestnanec ZAM ON PR.manazer = ZAM.osobne_cislo
JOIN Zadavatel ZAD ON PR.zadavatel = ZAD.id_zadavatela
LEFT OUTER JOIN Firma FI ON ZAD.id_zadavatela = FI.id_firmy
LEFT OUTER JOIN Sukromna_osoba SO ON ZAD.id_zadavatela = SO.id_sukromnej_osoby
WHERE ZAM.meno = 'Jan Novák'

One of the two result columns, nazov_firmy or meno, will be NULL.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top