0

投稿アドレスを含むテーブルがあります。私のクエリは次のようになります。

SELECT "ID", postcode, numbertype, minnumber, maxnumber
INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
FROM POSTCODE 
WHERE POSTCODE_ID = 79417568 AND (NUMBERTYPE = 'odd' OR NUMBERTYPE = 'mixed')

ほとんどの場合、1 行のみを配信する必要があるため、これは問題なく機能します。2 つの同一のレコード (1 つは numbertype = odd で、もう 1 つは混合) がある場合、クエリは 2 行を返します。

        ID POSTCODE NUMBERTYPE  MINNUMBER  MAXNUMBER
---------- -------- ---------- ---------- ----------
    395755 7941KD   odd                 9          9 
    395756 7941KD   mixed               1         22 

これでエラーが発生するので、これは望ましくありません。プログラムが numbertype = 'mixed' を含むレコードを 1 つだけ取得するソリューションを誰かが持っていますか?

したがって、上記の例では、このレコードを表示したくないだけです。

    ID POSTCODE NUMBERTYPE  MINNUMBER  MAXNUMBER

395756 7941KD   mixed               1         22 
4

2 に答える 2

2

これを達成するためにウィンドウ関数を使用することもできると思います:

SELECT "ID", postcode, numbertype, minnumber, maxnumber
  INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
  FROM (
    SELECT "ID", postcode, numbertype, minnumber, maxnumber
         , ROW_NUMBER() OVER ( PARTITION BY postcode ORDER BY DECODE(numbertype, 'mixed', 0, 1) ) AS rn
      FROM postcode
     WHERE postcode_id = 79417568 AND (numbertype = 'odd' OR numbertype = 'mixed')
) WHERE rn = 1

この場合、 の特定の値に対して 2 つのレコードがある場合、 の値が であるレコードがpostcode選択されます。節で単に を使用することもできますが、最初に来る必要があると言うほど明確ではありません。numbertype'mixed'ORDER BY numbertypeOVER( )'mixed'

お役に立てれば。

于 2015-01-09T13:25:35.580 に答える
0

これは集計で行うことができます。しかし、あなたが何を望んでいるかは正確には不明です。何かのようなもの:

SELECT min(id), postcode,
       (case when min(numbertype) = max(numbertype) then min(numbertype)
             else 'mixed'
        end)
       min(minnumber), max(maxnumber)
INTO huidigPostcodeID_FK, databasePostcode, databaseNumberType, databaseMinNumber, databaseMaxNumber
FROM POSTCODE 
WHERE POSTCODE_ID = 79417568 AND (NUMBERTYPE = 'odd' OR NUMBERTYPE = 'mixed')
GROUP BY postcode
于 2015-01-09T13:10:22.710 に答える