2016-07-13 9 views
1

を存在する場合にのみ、私は次の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テーブルにレコードしかない場合、追加のSELECTWHERE句が結果を破らないようにクエリを変更するにはどうすればよいですか?

はEDIT:

レコードが唯一Customersに存在し、私はそのレコードをしたいと私はCustomersテーブルに関連していないWHERE句が無視されたいです。

レコードが結合テーブルに存在する場合は、その結合テーブルに関係するWHERE句を使用します。

+0

説明してください....お客様と他のテーブルの間で一致する結果のみを必要とするか、両方ともしたいですか?エイリアス結果と顧客と他のテーブルの間に一致しない結果がありますか? – scaisEdge

+0

より明快に編集 – LXXIII

+1

顧客テーブルにないレコードの結合制限criteraを結合に移動します。例: 'LEFT JOIN StudentsCourses on Customers.Id = StudentsCourses.CustomerIdとStudentsCourses.SectionIdはNULLではありません。 AND St​​udentsCourses.Delete <> 2' studentsCoursesへの参加がnullの場合、顧客レコードを保持するために限度が参加前に適用されます。 。外部結合を使用する場合は、結合の前に結合制限基準を実行する必要があります。または、他の人が以下の回答で行ったように、あなたはヌルを考慮する必要があります。 – xQbert

答えて

1

nullを処理するには、whereステートメントを変更する必要があります。これはあなたが

WHERE Customers.Id <> 10 
    -- AND StudentsCourses.SectionId IS NOT NULL 
    AND COALESCE(StudentsCourses.Delete,0) <> 2 
    AND COALESCE(Courses.SchoolCode,'{$criteria["school_code"]}') = '{$criteria["school_code"]}' 
    AND COALESCE(Courses.Year,{$criteria["year"]}) = {$criteria["year"]} 
    AND (Courses.CourseType is null or Courses.CourseType LIKE '{$criteria["term"]}') 

参加左とするときのような値を使用すると、これらの項目のnullを持つことになりますが存在しません - まだあなたがどこ文がこれらの項目を除外していない必要がある行を参照してください。

ジョインに基準を入れる別の方法があります。ですから、例えばコースタイプについて次のようになります。

LEFT JOIN Courses ON StudentsCourses.CourseId = Courses.Id and Courses.CourseType LIKE '{$criteria["term"]}' 

あなたがこれを行うならば、あなたはどこにフィルタを追加する必要はありません - それは唯一の参加に適用されるとするためにnullを返します結合が存在しない場合は、表の列。

+0

どちらの答えでも、SQLで可能な新しいことがわかりました。私はそれらを試して戻ってくる! – LXXIII

+0

@LXXIII - いいね!がんばろう。 – Hogan

1

あなたは、あなたがそれを考慮して必要がありますので、該当する「権利」のレコードが存在しないそのためのフィールドにNULLを取得するつもりだ、参加を左:

WHERE Customers.Id <> 10 
    -- AND StudentsCourses.SectionId IS NOT NULL 
    AND (StudentsCourses.Delete <> 2 OR StudentsCourses.Delete IS NULL) 
    AND (Courses.SchoolCode = '{$criteria["school_code"]}' OR Courses.SchoolCode IS NULL) 
    AND (Courses.Year = {$criteria["year"]} OR Courses.Year IS NULL) 
    AND (Courses.CourseType LIKE '{$criteria["term"]}' OR Courses.CourseType IS NULL) 
+0

'StudentsCourses.Delete'が' null'の場合、レコードは存在しますが、Deleteフラグは設定されていない可能性があります。そのシナリオでそのレコードを表示したいと思う。 – LXXIII

+1

@LXXII - 私の例のように、これはそのレコードを表示します。 – Hogan

1

間違って両方。 2つの異なる形のタプルを返すクエリーはありません。タプルが存在する場合はここからの列ですが、ハットが存在する場合はその両方の列があります。 1つのクエリ、1つの図形。

これまで厳しく言われてきたように、ちょっとリラックスしましょう。

外部結合だけで、結合するデータが存在しない場合(=見つからない場合)、NULL値は表示された列に無言で埋め込まれます。 「人口が多い」という言葉は、それが好きな言葉です。

+0

私はあなたが正しいと思います。なぜなら、意図したとおりにクエリを正常に実行すると、二重のエントリを取得することになりました。学生はそれぞれのコースに出演しますが、「NULL」をコースとして追加のエントリが返されます。私はそれを2つのクエリに分けることになりました... – LXXIII

関連する問題