2012-11-13 20 views
1

我正在做一個查詢,查找出生在兩個日期之間的所有貓。每隻貓都有一個名字或多個名字。plsql/sql是否可以限制從連接返回的行,或者對每行進行某種子查詢?

初始查詢是一樣的東西

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

我也有一個表叫CatName這對每個類別ID,有這種貓已被其不同的所有者給一個或多個名稱。作爲查詢的一部分,我只想返回與CatName表中的Id匹配的名字。因此,像:

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

爲有5名貓,將返回5行。我只想要一排,第一個。如果我只是爲一隻貓檢索數據,那麼我只會使用ROWNUM將其限制爲1個查詢,但我試圖獲得所有貓的名單,包括他們的名字,所以我不能這樣做。

任何人都可以提供一些指導?我想它不一定是plsql特定的,這個技術將和我想象的一樣。

回答

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 
    

從性能上來看,假設CatNameCatId索引:

  • 如果回到貓的數量短小,或者你只是想在衆多的第一個少數貓,溶液1可真快,
  • 如果返回的數據集很大,並且您想要所有的貓,那麼解決方案2和3可以充分利用高效的HASH JOIN。
+0

在第一個例子中,'c.id'來自哪裏?如果它是'從貓c選擇'那麼這是非常簡單的,並會很好的工作 – NibblyPig

+0

是的,你是對的,我忘了別名 –

+0

這很好,謝謝你詳細介紹了三種方法。你讓它看起來很容易:) – NibblyPig

相關問題