2

次の行に沿った SQL クエリがあります。

SELECT R.NUMERIC_VAL, 'A'  /* query A */
  FROM TABLE_1  
 WHERE TABLE_1.DATE = TO_DATE('04/04/2012', 'DD/MM/YYYY') 
 UNION
SELECT E.NUMBER_VALUE, 'B' /* query B */
  FROM TABLE_2 
 WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
 UNION
SELECT E.OTHER_NUMBER_VALUE, 'C' /* query C */
  FROM TABLE_2
 WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
 ORDER BY 2

ご覧のとおり、私の現在のソリューションは文字 A、B、C をフェッチし、2 番目の列でクエリを並べ替えます。このクエリは、クエリごとに常に 1 行を返すという事実を知っています。2番目の列を使用せずに、クエリが現在書き込まれている順序でデータを返すクエリを取得する方法があるかどうか疑問に思っていましたか? ありがとう。

4

2 に答える 2

5

order by必要な順序で結果を取得するために使用する必要があります。が存在しない場合、SQL テーブルと SQL の結果は本質的に順不同order byですgroup by

UNION結果の順序を保証するものではありUNION ALLません。実際、多くのデータベースでUNIONは、重複除去プロセスの一環として結果がアルファベット順 (最初の列) で返されます。

に置き換えることができUNIONますUNION ALL。これは特定の順序で結果を返すことを保証するものではありませんが、通常は次の順序で結果を返します。

SELECT R.NUMERIC_VAL, 'A'  /* query A */
FROM TABLE_1  
WHERE TABLE_1.DATE = TO_DATE('04/04/2012', 'DD/MM/YYYY') 
UNION ALL
SELECT E.NUMBER_VALUE, 'B' /* query B */
FROM TABLE_2 
WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
UNION ALL
SELECT E.OTHER_NUMBER_VALUE, 'C' /* query C */
FROM TABLE_2
WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')

ただし、 を保持することをお勧めしますORDER BY

2 番目の列が必要ない場合は、サブクエリを使用します。

select NUMERIC_VAL
from (SELECT R.NUMERIC_VAL, 'A' as ordering /* query A */
      FROM TABLE_1  
      WHERE TABLE_1.DATE = TO_DATE('04/04/2012', 'DD/MM/YYYY') 
      UNION ALL
      SELECT E.NUMBER_VALUE, 'B' /* query B */
      FROM TABLE_2 
      WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
      UNION ALL
      SELECT E.OTHER_NUMBER_VALUE, 'C' /* query C */
      FROM TABLE_2
      WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
     ) t
ORDER BY ordering;
于 2013-09-02T11:42:20.393 に答える
5
SELECT NumVal FROM
(
    SELECT R.NUMERIC_VAL AS NumVal, 1 AS queryNo
    FROM TABLE_1  
    WHERE TABLE_1.DATE = TO_DATE('04/04/2012', 'DD/MM/YYYY') 
    UNION
    SELECT E.NUMBER_VALUE AS NumVal, 2 AS queryNo
    FROM TABLE_2 
    WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
    UNION
    SELECT E.OTHER_NUMBER_VALUE AS NumVal, 3 AS queryNo
    FROM TABLE_2
    WHERE TABLE_2.DATE = TO_DATE('05/04/2012', 'DD/MM/YYYY')
) T
ORDER BY queryNo ASC

偽の2番目の列なしでこれを確実に行う方法はわかりませんが、この方法では少なくとも結果の一部ではありません. また、 を使用してみることもできますUNION ALL。これは、重複した値を排除する必要がないことを意味し、順序を維持する可能性がありますが、私が言ったように、おそらく確実ではありません。

于 2013-09-02T11:38:16.747 に答える