代码之家  ›  专栏  ›  技术社区  ›  Ikke

ON子句中的附加条件被忽略

  •  0
  • Ikke  · 技术社区  · 15 年前

    我有这样的疑问:

        SELECT
            TA.id,
            T.duration,         
            DATE_FORMAT(TA.startTime,'%H:%i') AS startTime,
            TEI.displayname,
            TA.threatment_id,
            TE.employeeid,
            TTS.appointment_date
        FROM
            tblEmployee AS TE
            INNER Join tblEmployeeInfo AS TEI ON TEI.employeeinfoid = TE.employeeinfoid
            LEFT OUTER Join tblAppointment AS TA ON TE.employeeid = TA.employee_id
            LEFT OUTER Join tblThreatment AS T ON TA.threatment_id = T.threatmentid
            LEFT OUTER Join tblAppointments AS TTS ON TTS.id = TA.appointments_id 
                AND TTS.appointment_date = '2009-10-19'
            LEFT OUTER Join tblCustomerCard AS TCC ON TCC.customercardid = TTS.customercard_id
        WHERE
            TE.employeeid = 1 
    

    我所要做的就是选择一个员工,如果可以的话,在给定的日期安排所有的约会。当没有任何预约时,它至少应该提供有关员工的信息。

    但现在,它只给出与员工相关的所有约会,并在日期不匹配时传递空值。这里出什么事了?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Mongus Pong    15 年前

    因为您正在执行左外部联接,所以它将只联接与on条件匹配的记录,并且在不满足条件时附加null。

    您仍然会得到在该日期没有约会的记录。

    如果执行了内部联接,则如果不满足on条件,则不会输出任何记录。因此,您将不会得到任何在该日期没有预约的记录。

        2
  •  0
  •   Mongus Pong    15 年前

    好的,不确定您在哪个数据库上,但这可以在SQL Server上工作:

    select * from tblEmployee TA
    ...
    left join 
    ( select * from tblAppointments ed where ed.appointment_date = '10/01/2008' ) TTS
    on  ON TTS.id = TA.appointments_id 
    

    不管怎样,这就是氛围!你可能需要修补一下。我在工作,不能让整个事情为你去!:)