0

私はSQLを初めて使用します。Oracle10gを使用しています。私は以下のクエリを持っています。それは3つの部分で構成され、3つの部分すべてのUNIONを実行しています。ただし、すべてのクエリで、結合テーブルを除くほとんどのロジックが一般的です。UNIONを回避し、すべてを1つのブロックに配置することは可能ですか?

    SELECT DISTINCT e.some_id
         FROM
             main_table e,
             main_table_join_one x     //only change
             where  e.some_id = x.some_id(+)
             and (x.status in('A','I') or x.status is null)
             and e.code='XYZ' and e.second_code in('XYZ','ABC')

             UNION

    SELECT DISTINCT ef.some_id
         FROM
             main_table ef,
             main_table_join_two xf  //only change
             where  ef.some_id = xf.some_id(+)
             and (xf.status in('A','I') or xf.status is null)
             and ef.code='XYZ' and ef.second_code in('XYZ','ABC')

             UNION

    SELECT DISTINCT eff.some_id
         FROM
             main_table eff,
             main_table_join_three xff   //only change
             where  eff.some_id = xff.some_id(+)
             and (xff.status in('A','I') or xff.status is null)
             and eff.code='XYZ' and eff.second_code in('XYZ','ABC')

ありがとう!

4

4 に答える 4

1

あなたが使用できる存在

select distinct e.some_id
  from main_table e
 where e.code = 'XYZ'
   and e.second_code in ('XYZ', 'ABC')
   and (exists (select 0
                  from main_table_join_one x / / only change
                 where x.some_id = e.some_id
                   and (x.status in ('A', 'I') or x.status is null)) 
    or exists
        (select 0
           from main_table_join_two x / / only change
          where x.some_id = e.some_id
            and (x.status in ('A', 'I') or x.status is null))  
    or exists
        (select 0
           from main_table_join_three x / / only change
          where x.some_id = e.some_id
            and (x.status in ('A', 'I') or x.status is null)))

編集済み

トピックスターターの場合と完全に同じ結果

select distinct e.some_id
  from main_table e
 where e.code = 'XYZ'
   and e.second_code in ('XYZ', 'ABC')
   and (exists (select 0
                  from main_table_join_one x
                 where x.some_id = e.some_id
                   and x.status in ('A', 'I')) 
    or not exists
        (select 0 from main_table_join_one x where x.some_id = e.some_id) 
    or exists
        (select 0
           from main_table_join_two x
          where x.some_id = e.some_id
            and x.status in ('A', 'I'))
    or not exists
        (select 0 from main_table_join_two x where x.some_id = e.some_id) 
    or exists
        (select 0
           from main_table_join_three x
          where x.some_id = e.some_id
            and x.status in ('A', 'I')) 
    or not exists
        (select 0 from main_table_join_three x where x.some_id = e.some_id))
于 2013-03-06T11:06:27.407 に答える
0

なぜOUTERJOINを使用しているのですか?を選択するだけmain_table.some_idで、外部結合は、他のテーブルに一致するものがあるかどうかに関係なく、それを取得することを意味します。(Mark Ba​​nnisterが観察しているように、外部結合構文を変更したため、実際には内部結合を実行しています)。

したがって、次のコマンドを実行するだけで、同じ結果セットが得られます(外部結合構文を修正したと仮定)。

SELECT DISTINCT e.some_id
FROM main_table e
where e.code='XYZ' 
and e.second_code in('XYZ','ABC')

おそらく、サニタイズされたテストケースを提示する際のロジックを混乱させたのでしょうか。それとも、実装することになっているビジネスルールについて明確ではありませんか?

于 2013-03-06T12:34:34.360 に答える
0
    select distinct ear.RecId,0 Recid,em.EmpCode EmpId,                 
      (em.EmpFirstName+' '+em.EmpMiddleName+' '+em.EmpLastName) as Name,                   
   dm.DeptName as Department,                  
   EAR.AttendType [AttendType],                  

  Convert(varchar,ActualDate,110)  [AttendDate],                  
   EAR.Reason,                      
   ear.StatusOfAdmin Status                      
    from Employeemaster em,                   
   DepartmentMaster dm,                  
   EmpAttenednaceRequest ear,                  
   empAttendanceRequestTransaction eart  
于 2014-09-26T16:58:42.983 に答える
-1

このクエリを試してください

 SELECT DISTINCT e.some_id
 FROM
         main_table e,
         main_table_join_one x,
         main_table_join_two xf,
         main_table_join_three xff 
 where e.code='XYZ' and e.second_code in('XYZ','ABC') AND
         ((e.some_id = x.some_id
         and (x.status in('A','I') or x.status is null) 
         OR (ef.some_id = xf.some_id
         and (xf.status in('A','I') or xf.status is null))
         OR (eff.some_id = xff.some_id
         and (xff.status in('A','I') or xff.status is null)))

efとeffが存在しない場合

編集済み

 SELECT DISTINCT e.some_id
 FROM
         main_table e,
         main_table_join_one x,
 where e.code='XYZ' and e.second_code in('XYZ','ABC') AND
         e.some_id = x.some_id and
         (x.status in('A','I') or x.status is null);
于 2013-03-06T09:44:44.993 に答える