sql >> データベース >  >> RDS >> Sqlserver

SQL Server で複数の種類のデータをキャッチする

    つまり、奇妙に編成されたタスク テーブルがあるように見えます。その結果、正しくクエリを実行するには、やや奇妙なことを行う必要があります。あなたの説明によると、タスク テーブルの行には、studentId、admissionId、enquiryId、または enquiryDetailId のいずれかが含まれています。これはこれを行うための最適な方法ではありません...しかし、自分が持っているものでやり遂げなければならない場合があることは理解しています.

    したがって、名前を取得するには、名前のソースに参加する必要があります...関連するテーブルのいたるところにあると仮定すると、次のようにすることができます:

    select 
      t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
    from Task t inner join Student s on t.StudentId = s.Id
    union all
    select 
      t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
    from Task t inner join Admission a on t.AdmissionId = a.Id
    union all 
    select 
      t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
    from Task t inner join Enquiry e on t.EnquiryId = e.Id
    union all 
    select 
      t.StudentID,t.AdmissionID,t.EnquiryID,t.EnquiryDetailsID,x.FirstName,x.LastName
    from Task t inner join EnquiryDetail d on t.EnquiryDetailId = d.Id
    

    ...または、同じことを裏返しに行うこともできます:

    select 
      t.StudentID, 
      t.AdmissionID, 
      t.EnquiryID, 
      t.EnquiryDetailsID,
      x.FirstName,
      x.LastName
    from 
      Task t
      inner join
      (
        select 's' source, Id, FirstName, LastName from Student union all
        select 'a' source, Id, FirstName, LastName from Admission union all
        select 'e' source, Id, FirstName, LastName from Enquiry union all
        select 'd' source, Id, FirstName, LastName from EnquiryDetail
      ) as x
      on
        ( t.StudentId  = x.Id and x.source = 's' )
        or
        ( t.AdmissionId = x.Id and x.source = 'a' )
        or
        ( t.EnquiryId = x.Id and x.source = 'e' )
        or 
        ( t.EnquiryDetailId = x.Id and x.source = 'd' )
    where 
      t.TaskUser=0 and t.BranchID=1
    


    1. 配列PHPからテーブルに挿入

    2. SQLUNIONチートシートと10の簡単で便利なヒント

    3. MySQLの2つのフィールドでSQLLEFT-JOIN

    4. SQLServerのメモリ最適化テーブルでのインデックスの使用