将我的SELECT查询转换为不太复杂的查询

时间:2017-12-12 20:13:52

标签: sql sql-server

晚上好,

我目前正在我的一个项目中工作,以获得更多关于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%的错误结果。

有没有人给我一个提示?

1 个答案:

答案 0 :(得分:1)

首先,您在第二个查询中获得错误标记的原因:这很可能是因为您加入的(HuurovereenkomstAccessoireAccessoire)中的一个或两个表返回多行。由于加入它会导致多行,然后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'

不确定在没有实际尝试的情况下哪个更快,但两者都应该为您提供技术上正确的结果。