晚上好,
我目前正在我的一个项目中工作,以获得更多关于SQL的技能和知识,但此时此刻我被困在一个头脑中。到目前为止,我花了一个多小时才尝试所有不同的方法,只有一个工作太复杂了。
我必须创建的查询: 选择所有huurovereenkomsten(租约),其中包含一个名为' Kinderzitje'或者' Helm' AND包含至少2辆自行车。
SELECT h.Huurovereenkomst_id, h.Huurovereenkomst_Begin_datum,h.Huurovereenkomst_Eind_datum
FROM Huurovereenkomst AS h
WHERE h.Huurovereenkomst_id IN (
SELECT h.Huurovereenkomst_id
FROM Huurovereenkomst AS h
JOIN HuurovereenkomstFiets AS hf ON h.Huurovereenkomst_id = hf.HuurovereenkomstFiets_Huurovereenkomst_id
JOIN Fiets AS f ON hf.HuurovereenkomstFiets_Fiets_id = f.Fiets_id
GROUP BY h.Huurovereenkomst_id,h.Huurovereenkomst_Begin_datum,h.Huurovereenkomst_Eind_datum
HAVING COUNT(hf.HuurovereenkomstFiets_Huurovereenkomst_id) >= 2
)
AND h.Huurovereenkomst_id IN (
SELECT h.Huurovereenkomst_id
FROM Huurovereenkomst AS h
JOIN HuurovereenkomstAccessoire as ha ON h.Huurovereenkomst_id = ha.HuurovereenkomstAccessoire_Huurovereenkomst_id
JOIN Accessoire as a ON ha.HuurovereenkomstAccessoire_Accessoire_id = a.Accessoire_id
JOIN AccessoireSoort AS aso ON a.Accessoire_Soortnr = aso.AccessoireSoort_id
WHERE aso.AccessoireSoort_naam ='Kinderzitje' OR aso.AccessoireSoort_naam ='Helm'
)
这个工作正常,但太复杂了,我想换成这样的东西:
SELECT h.Huurovereenkomst_id, h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum
FROM Huurovereenkomst h
INNER JOIN HuurovereenkomstAccessoire ha
ON h.Huurovereenkomst_id = ha.HuurovereenkomstAccessoire_Huurovereenkomst_id
INNER JOIN Accessoire a
ON a.Accessoire_id = ha.HuurovereenkomstAccessoire_Accessoire_id
INNER JOIN AccessoireSoort acs
ON acs.AccessoireSoort_id = a.Accessoire_Soortnr
INNER JOIN HuurovereenkomstFiets hf
ON hf.HuurovereenkomstFiets_Huurovereenkomst_id = h.Huurovereenkomst_id
WHERE ha.HuurovereenkomstAccessoire_Accessoire_id IN (SELECT Accessoire_id
FROM Accessoire a
INNER JOIN AccessoireSoort Acs
ON acs.AccessoireSoort_id = a.Accessoire_Soortnr
WHERE acs.AccessoireSoort_naam = 'Kinderzitje' OR acs.AccessoireSoort_naam = 'Helm')
GROUP BY h.Huurovereenkomst_id, h.Huurovereenkomst_Begin_datum, h.Huurovereenkomst_Eind_datum
HAVING COUNT(HuurovereenkomstFiets_Huurovereenkomst_id) >= 2
但与上一次相比,它一直给我10%的错误结果。
有没有人给我一个提示?
答案 0 :(得分:1)
首先,您在第二个查询中获得错误标记的原因:这很可能是因为您加入的(HuurovereenkomstAccessoire
或Accessoire
)中的一个或两个表返回多行。由于加入它会导致多行,然后HAVING COUNT(hf.HuurovereenkomstFiets_Huurovereenkomst_id) >= 2
计算为true,即使没有该连接也没有。对于您的第二个查询,您可以通过执行COUNT(DISTINCT hf.HuurovereenkomstFiets_Huurovereenkomst_id) >= 2
你也可以这样做:
SELECT DISTINCT h.Huurovereenkomst_id,
h.Huurovereenkomst_Begin_datum,
h.Huurovereenkomst_Eind_datum
FROM
(
SELECT h.Huurovereenkomst_id,h.Huurovereenkomst_Begin_datum,h.Huurovereenkomst_Eind_datum
FROM Huurovereenkomst AS h
INNER JOIN HuurovereenkomstFiets AS hf ON h.Huurovereenkomst_id = hf.HuurovereenkomstFiets_Huurovereenkomst_id
JOIN Fiets AS f ON hf.HuurovereenkomstFiets_Fiets_id = f.Fiets_id
GROUP BY h.Huurovereenkomst_id,h.Huurovereenkomst_Begin_datum,h.Huurovereenkomst_Eind_datum
HAVING COUNT(hf.HuurovereenkomstFiets_Huurovereenkomst_id) >= 2
) h
INNER JOIN HuurovereenkomstAccessoire as ha ON h.Huurovereenkomst_id = ha.HuurovereenkomstAccessoire_Huurovereenkomst_id
INNER JOIN Accessoire as a ON ha.HuurovereenkomstAccessoire_Accessoire_id = a.Accessoire_id
WHERE aso.AccessoireSoort_naam ='Kinderzitje' OR aso.AccessoireSoort_naam ='Helm'
不确定在没有实际尝试的情况下哪个更快,但两者都应该为您提供技术上正确的结果。