1

2 つの日付の間に生まれたすべての猫を検索するクエリを実行しています。それぞれの猫には名前、または複数の名前があります。

最初のクエリは次のようなものです

SELECT Id, Color FROM Cat WHERE Cat.BirthDate > dat_min AND Cat.BirthDate < dat_max;

CatNameまた、各猫 Id に対して、この猫が異なる所有者によって付けられた 1 つ以上の名前を持つ、という名前のテーブルもあります。CatNameクエリの一部として、テーブル内の Id に一致する最初の名前のみを返したいです。次のようなものです:

SELECT Id, Color, Name FROM Cat JOIN CatName on .....

5 つの名前を持つ猫の場合、5 行が返されます。最初の1行だけが必要です。1 匹の猫のデータのみを取得する場合は、ROWNUM を使用して 1 つのクエリに制限しますが、名前を含むすべての猫のリストを取得しようとしているため、これを行うことはできません。

誰でもガイダンスを提供できますか?plsql固有である必要はないと思います。テクニックは私が想像するものと同じです。

4

1 に答える 1

2

いくつかの方法があります。

  1. インライン クエリを使用できます。

    SELECT id, color, 
           (SELECT name FROM CatName cn WHERE cn.id = c.id AND ROWNUM = 1) Name
      FROM cat c
     WHERE ...
    
  2. 結合してから分析を使用できます。

    SELECT id, color, Name
      FROM (SELECT Id, Color, Name,
                   row_number() OVER (PARTITION BY id ORDER BY 1) rn
              FROM Cat JOIN CatName on .....)
     WHERE rn = 1
    
  3. 集計を使用できます。

    SELECT id, color, MAX(name) name
      FROM Cat JOIN CatName on .....
     GROUP BY id, color
    

パフォーマンスの観点から、次のようCatNameにインデックス付けされていると仮定しCatIdます。

  • 返される猫の数が少ない場合、または多数の猫のうち最初の数匹だけが必要な場合、解決策 1 は非常に高速です。
  • 返されたデータセットが大きく、すべての猫が必要な場合は、ソリューション 2 と 3 で効率的な HASH JOIN をうまく利用できます。
于 2012-11-13T14:25:56.883 に答える