1

我正在做一个查询,查找在两个日期之间出生的所有猫。每只猫都有一个名字或多个名字。

初始查询类似于

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

我还有一个名为的表CatName,对于每个 Cat Id,它都有一个或多个名字,这只猫是由它的不同主人起的。我只想返回与CatName表中 Id 匹配的名字,作为查询的一部分。所以像:

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

对于有 5 个名字的猫,将返回 5 行。我只想要一排,第一排。如果我只检索一只猫的数据,那么我只会使用 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 回答