我有以下SQL查询:从连接表仅当记录存在
SELECT
Customers.CustomerName AS FullName,
Customers.Id AS CustomerId,
Customers.UserRoleId AS UserRoleId,
Customers.Email AS Email,
IFNULL(Customers.StudentId, '') AS CustomersStudentId,
IFNULL(Customers.MagentoId, '') AS MagentoId,
Sections.Id AS SectionId,
Sections.SectionNumber AS SectionNumber,
Sections.SectionName AS SectionName,
Courses.Id AS CourseId,
IFNULL(Courses.CourseName, '') AS CourseName,
IFNULL(Courses.CourseNumber,'') AS CourseNumber,
IFNULL(Courses.CourseDepartment, '') AS CourseDepartment,
IFNULL(Courses.Notes, '') AS CourseNotes,
IFNULL(Courses.Year, '') AS CourseYear,
IFNULL(Courses.CourseType, '') AS CourseType,
StudentsCourses.Id AS StudentsCoursesId,
IFNULL(StudentsCourses.StudentId, '') AS StudentsCoursesStudentId,
IFNULL(SiteProfile.StudentIdField, '') AS StudentIdField,
IFNULL(SiteProfile.SchoolEmailDomain, '') AS SchoolEmailDomain,
IFNULL(Orders.Id, '') AS OrderId
FROM Customers
LEFT JOIN StudentsCourses ON Customers.Id = StudentsCourses.CustomerId
LEFT JOIN Sections ON StudentsCourses.SectionId = Sections.Id
LEFT JOIN Courses ON StudentsCourses.CourseId = Courses.Id
LEFT JOIN BooksCourses ON Courses.Id = BooksCourses.CourseId
LEFT JOIN Products ON BooksCourses.ISBN = Products.ISBN
LEFT JOIN EbookVendors ON Products.EbookVendorId = EbookVendors.Id
LEFT JOIN Orders ON Customers.Id = Orders.CustomerId
LEFT JOIN SiteProfile ON Courses.SchoolCode = SiteProfile.SchoolCode
WHERE Customers.Id <> 10
AND StudentsCourses.SectionId IS NOT NULL
AND StudentsCourses.Delete <> 2
AND Courses.SchoolCode = '{$criteria["school_code"]}'
AND Courses.Year = {$criteria["year"]}
AND Courses.CourseType LIKE '{$criteria["term"]}'
记录会一直存在于Customers
表。但是有时在任何其他连接的表中都不会有关联的记录。
如何修改查询,以便在Customers
表中只有记录时,附加的SELECT
和WHERE
子句不会中断结果?
编辑:
当记录只在Customers
存在,我希望这个纪录,我想WHERE
条款,不属于该Customers
表被忽略。
如果记录存在于连接表中,我希望与该连接表有关的WHERE
子句起作用。
解释得更好...请....只需要客户和其他人表之间匹配的结果,或者您希望两者都有....别名匹配结果和客户与其他表之间不匹配的结果? – scaisEdge
更加清晰地编辑 – LXXIII
将不在客户表中的记录上的连接限制批评移至连接。例如:'LEFT JOIN StudentsCourses ON Customers.Id = StudentsCourses.CustomerId and StudentsCourses.SectionId IS NOT NULL AND StudentsCourses.Delete <> 2'限制应用于连接之前,因此在与studentsCourses的连接为空时保留客户记录。在使用外部连接时,大部分时间都需要在连接之前执行。或者你必须像其他人在下面的答案中所做的那样解决空值问题。 – xQbert