我有一个问题:
SELECT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie, OGLOSZENIA.Opis,
WOJEWODZTWA.Nazwa_wojewodztwo, OGLOSZENIA.Miasto, OGLOSZENIA.Rocznik, OGLOSZENIA.Cena,
OGLOSZENIA.id_model, MARKI.Nazwa_marka, MODELE.Nazwa_model, ZDJECIA.Zdjecie,
SILNIK.Nazwa_silnik, KOLORY.Nazwa_kolor, OGLOSZENIA.Moc, OGLOSZENIA.Pojemnosc
FROM OGLOSZENIA, MARKI, MODELE, ZDJECIA, WOJEWODZTWA, TYP_NADWOZIA, SILNIK, KOLORY
WHERE OGLOSZENIA.Id_koloru = KOLORY.Id_koloru AND
OGLOSZENIA.Id_silnik = SILNIK.Id_silnik AND
OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria AND
MODELE.Id_marka = MARKI.Id_marka AND
OGLOSZENIA.Id_model = MODELE.Id_model AND
OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia
ORDER BY OGLOSZENIA.Id_ogloszenia DESC;
在DB中,我在'OGLOSZENIA'中有3行,但是当我查询时,显示48行。数据库中的1行显示16次。哪里有问题?
答案 0 :(得分:2)
您有8个表但只有6个连接条件。缺少一个条件,结果为CROSS JOIN
。
FROM
部分:
FROM OGLOSZENIA, MARKI, MODELE, ZDJECIA
, WOJEWODZTWA, TYP_NADWOZIA, SILNIK, KOLORY
WHERE OGLOSZENIA.Id_koloru = KOLORY.Id_koloru AND
OGLOSZENIA.Id_silnik = SILNIK.Id_silnik AND
OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria AND
MODELE.Id_marka = MARKI.Id_marka AND
OGLOSZENIA.Id_model = MODELE.Id_model AND
OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia
应使用显式JOIN
语法编写:
FROM OGLOSZENIA
JOIN SILNIK ON OGLOSZENIA.Id_silnik = SILNIK.Id_silnik
JOIN MODELE ON OGLOSZENIA.Id_model = MODELE.Id_model
JOIN MARKI ON MODELE.Id_marka = MARKI.Id_marka
JOIN KOLORY ON OGLOSZENIA.Id_koloru = KOLORY.Id_koloru
JOIN ZDJECIA ON OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia
JOIN TYP_NADWOZIA ON OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria
JOIN WOJEWODZTWA ON ???
答案 1 :(得分:1)
如果使用显式连接语法重写查询,您将立即看到并非所有内容都正确连接:
SELECT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie, OGLOSZENIA.Opis,
WOJEWODZTWA.Nazwa_wojewodztwo, OGLOSZENIA.Miasto, OGLOSZENIA.Rocznik, OGLOSZENIA.Cena,
OGLOSZENIA.id_model, MARKI.Nazwa_marka, MODELE.Nazwa_model, ZDJECIA.Zdjecie,
SILNIK.Nazwa_silnik, KOLORY.Nazwa_kolor, OGLOSZENIA.Moc, OGLOSZENIA.Pojemnosc
FROM OGLOSZENIA
join MARKI ???
join MODELE on MODELE.Id_marka = MARKI.Id_marka and OGLOSZENIA.Id_model = MODELE.Id_model
join ZDJECIA ???
join WOJEWODZTWA on OGLOSZENIA.Id_ogloszenia = ZDJECIA.Id_ogloszenia
join TYP_NADWOZIA on OGLOSZENIA.Id_kategoria = TYP_NADWOZIA.Id_kategoria
join SILNIK on OGLOSZENIA.Id_silnik = SILNIK.Id_silnik
join KOLORY on OGLOSZENIA.Id_koloru = KOLORY.Id_koloru
ORDER BY OGLOSZENIA.Id_ogloszenia DESC;
这意味着您在几个表上获得交叉连接,这会导致您的输出成倍增加。
除了使用显式JOIN语法之外,我还建议使用表别名来帮助您清理和理解查询。类似的东西:
SELECT o.Id_ogloszenia, tn.Nazwa_nadwozie, o.Opis,
w.Nazwa_wojewodztwo, o.Miasto, o.Rocznik, o.Cena,
o.id_model, mk.Nazwa_marka, mo.Nazwa_model, z.Zdjecie,
s.Nazwa_silnik, k.Nazwa_kolor, o.Moc, o.Pojemnosc
FROM OGLOSZENIA as o
join MARKI as mk ???
join MODELE as mo on mo.Id_marka = mk.Id_marka and o.Id_model = mo.Id_model
join ZDJECIA as z ???
join WOJEWODZTWA as w on o.Id_ogloszenia = z.Id_ogloszenia -- THIS IS INCORRECT...
join TYP_NADWOZIA as tn on o.Id_kategoria = tn.Id_kategoria
join SILNIK as s on o.Id_silnik = s.Id_silnik
join KOLORY as k on o.Id_koloru = k.Id_koloru
ORDER BY o.Id_ogloszenia DESC;
为了继续前进,我建议修剪一些表格,缩小到您需要的结果集,然后添加更多联接以获取最终查询的详细信息。从简单到复杂的迭代。
答案 2 :(得分:0)
SELECT DISTINCT OGLOSZENIA.Id_ogloszenia, TYP_NADWOZIA.Nazwa_nadwozie ...