SQL从表或其他方面选择不确定的现有列

时间:2014-03-20 12:21:29

标签: sql select exists

我使用泛化/特化表Zadavatel(包含主键)作为表Sukromna_osoba或Firma(两者都包含指向Zadavatel的外键)。 如果存在Sukromna_osoba.meno ='string',则需要选择Sukromna_osoba表;如果两个条件都为真,则需要选择Firma.nazov_firmy ='string'的Firma表。我也需要这个选择。

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是主键,id_sukromnej_osoby和id_firmy是指向id_zadavatela的外键。

我试过这样的事情:

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'
)

1 个答案:

答案 0 :(得分:0)

由于您不知道它是公司还是个人,您可以在两者上使用左外连接,如下所示:

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'

两个结果列之一nazov_firmymeno将为NULL