0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【oracle備忘録】UNION ALL句にキーを持たせて、UNION ALL句を並び替え

Posted at

※この備忘録は初学者の私が学習、もしくは業務で体験した内容を忘れないために書き起こしたものとなります。

目的

画面1、画面2、画面3内の未完了明細の件数を画面4を見て把握できるようにするため、
「画面名称」「未完了件数」をまとめて抽出する用のSQL文を作成したい。
 ※各画面の表示内容については、各画面下にデータ参照元を記載

image.png
※全てGAMEN1テーブルから参照
・[物件No.]…GAMEN1.BUKKEN_NO
・[案件名]…GAMEN1.ANKEN_NAME
・[予算]…GAMEN1.YOSAN
・[完了]…GAMEN1.KANRYO ※未完了の場合…"0", 完了の場合…"1"
image.png
※全てGAMEN2テーブルから参照
・[物件No.]…GAMEN2.BUKKEN_NO
・[案件名]…GAMEN2.ANKEN_NAME
・[経費予算]…GAMEN2.KEIHI_YOSAN
・[完了]…GAMEN2.KANRYO ※未完了の場合…"0", 完了の場合…"1"
image.png
※全てGAMEN3テーブルから参照
・[物件No.]…GAMEN3.BUKKEN_NO
・[案件名]…GAMEN3.ANKEN_NAME
・[輸送費予算]…GAMEN3.YUSOUHI_YOSAN
・[完了]…GAMEN3.KANRYO ※未完了の場合…"0", 完了の場合…"1"
image.png

誤答

下記のソースで抽出したデータをそのままC#を用いて(例えばforeach等で)画面に表示させた場合、画面4に表示される画面名称の順番が、上から
「物件製作原価見積画面」⇒「経費見積画面」⇒「輸送費見積画面」
の順番にならない場合があった。(私の環境では、正しい順で表示されたが、別の方の環境では誤った順で表示されてしまった)

-- ■各画面の未完了件数,名称取得

WITH

-- 画面1(物件製作原価見積画面)の未完了件数
GAMEN1_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
  FROM GAMEN1
 WHERE GAMEN1.KANRYO = '0'),

-- 画面2(経費見積画面)の未完了件数
GAMEN2_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN2
  WHERE GAMEN2.KANRYO = '0'),

-- 画面3(輸送費見積画面)の未完了件数
GAMEN3_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN3
  WHERE GAMEN3.KANRYO = '0')

SELECT '物件製作原価見積画面'  AS GAMEN_NAME    --画面名称
      ,MIKANRYO              AS MIKANRYO_NUM  --未完了件数
  FROM GAMEN1_MIKAN

UNION ALL

SELECT '経費見積画面'
      ,MIKANRYO
  FROM GAMEN2_MIKAN

UNION ALL

SELECT '輸送費見積画面'
      ,MIKANRYO
  FROM GAMEN3_MIKAN

原因

上記コード内で、WITH句以降のSELECT文で、ORDER BYで表示順を指定しなかったため。

正しく表示されたコード

-- ■各画面の未完了件数,名称取得

WITH

-- 画面1(物件製作原価見積画面)の未完了件数
GAMEN1_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
  FROM GAMEN1
 WHERE GAMEN1.KANRYO = '0'),

-- 画面2(経費見積画面)の未完了件数
GAMEN2_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN2
  WHERE GAMEN2.KANRYO = '0'),

-- 画面3(輸送費見積画面)の未完了件数
GAMEN3_MIKAN AS
(SELECT COUNT(KANRYO) AS MIKANRYO
   FROM GAMEN3
  WHERE GAMEN3.KANRYO = '0')

SELECT '物件製作原価見積画面'  AS GAMEN_NAME    --画面名称
      ,MIKANRYO              AS MIKANRYO_NUM  --未完了件数
      ,1                     AS KEY           --表示順を決める為のキーナンバー
  FROM GAMEN1_MIKAN

UNION ALL

SELECT '経費見積画面'
      ,MIKANRYO
      ,2                     AS KEY
  FROM GAMEN2_MIKAN

UNION ALL

SELECT '輸送費見積画面'
      ,MIKANRYO
      ,3                     AS KEY
  FROM GAMEN3_MIKAN

 OREDR BY KEY

感想

今回、自分の環境ではORDER BYを用いなくても、たまたま上手く正しい表示順で出力できたため問題なかったが、UNION ALL句は必ずしも上の句から順に表示される訳ではないことが分かった。
表示順を指定したい場合は、必ずORDER BYを用いて、誰の環境で実装した場合でも正しい表示順で出力されるようにSQL文を作成したい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?