2
ID  RANGE_ID            START_DATE    END_DATE    BAND_TYPE           FLAG_LINE
3     1               01/03/2013    31/03/2013          R                   1
4     1               01/03/2013    31/03/2013          R                   0
5     2               01/03/2013    31/03/2013          R                   1
6     2               01/03/2013    31/03/2013          R                   0
7     3               01/03/2013    31/03/2013          R                   0
8     3               01/03/2013    31/03/2013          N                   0

このテーブルから、RANGE_ID ごとに、次の条件を使用して行を選択する必要があります。(ID フィールドを除いて) 同一の列を持つ行がある場合は、FLAG_LINE = 1 の行のみを選択します。それらの 1 つに FLAG_LINE=1 列が含まれている場合は、それらすべてを選択します。これに基づいて、クエリは次の結果を返す必要があります。

ID  RANGE_ID          START_DATE    END_DATE      BAND_TYPE           FLAG_LINE
3     1               01/03/2013    31/03/2013          R                   1
5     2               01/03/2013    31/03/2013          R                   1
7     3               01/03/2013    31/03/2013          R                   0
8     3               01/03/2013    31/03/2013          N                   0

私はチャンクでそれをやろうとしました:つまり、各RANGEに対して同様のものを実行します:

begin
  for x in ( select count(*) cnt
               from dual 
              where exists (
                select 1 FROM myTable 
                WHERE RANGE_ID = 1 AND FLAG_LINE = 1) )
  loop
        if ( x.cnt = 1 ) 
        then
           dbms_output.put_line('flag line exists');
           --insert the line with FLAG_LINE = 1 into temp table for this range
        else 
           dbms_output.put_line('does not exist');
           --insert the lines into temp table for this range
        end if;
  end loop;
end;

各 RANGE に対してこのメ​​ソッドを使用して、一時テーブルにデータを入力し、最後に結果を返しますが、これはあまり柔軟ではありません。これを達成できる別の方法はありますか?

ありがとう

4

3 に答える 3

3

このようにしてみてください...

Select * from tablename where flag=1 
union 
(Select * from tablename a where  (Select count(*) from tablename b 
where a.Range_id=b.RANGE_ID  and b.flag=1)<1)

SQL FIDDLE デモ

于 2013-06-27T11:45:06.853 に答える
1

これを試して。

select * from myTable
 where flag_line = 1
       or
       (range_id, start_date, end_date, band_type) in (
                  select range_id, start_date, end_date, band_type
                    from myTable
                group by range_id, start_date, end_date, band_type
                  having max(flag_line) = 0)
于 2013-06-27T11:50:07.167 に答える
0

あなたが望む結果を得るための別の方法があります

SELECT *
  FROM info
 WHERE flag_line = 1
UNION
SELECT *
  FROM info i1
 WHERE NOT EXISTS (SELECT NULL
                     FROM info i2
                    WHERE i2.range_id = i1.range_id
                      AND i2.flag_line = 1
                   )
于 2013-06-27T11:57:09.983 に答える