sql case自加入

时间:2018-02-09 00:36:35

标签: sql oracle

使用oracle 以下是我自己加入的表的代码的简单版本。 没有理由进行自我加入,但我留下了代码并返回了意想不到的结果。我已经在我的代码中修复了这个问题,但我想了解发生了什么。

我会得到一个'是的'或者没有'取决于我在case语句中为字段 population 选择的别名表。

以下返回'是'但如果人口 ='高'我不想搬到那里。

我不明白?我怀疑别名 b 在案例陈述中没有被评估,但为什么?

SELECT a.name, 
    a.continent, 
    a.population, 
    case 
      when b.population = 'high' then 'no'    
      else 'yes' 
    end "move there?"
FROM world a,
world b

2 个答案:

答案 0 :(得分:1)

您问题中的查询未指定world a应该如何加入world b,因此所有记录a 正在已加入 b 中的所有记录。这被称为笛卡尔连接或CROSS JOIN,如果您使用ANSI样式的连接,它将被编码为:

SELECT a.name, 
       a.continent, 
       a.population, 
       case 
         when b.population = 'high' then 'no'    
         else 'yes' 
       end "move there?"
  FROM world a
  CROSS JOIN world b

这可能不是预期的。 : - )

我怀疑所需要的是做一个INNER JOIN。使用ANSI样式的连接,这就像

SELECT a.name, 
       a.continent, 
       a.population, 
       case 
         when b.population = 'high' then 'no'    
         else 'yes' 
       end "move there?"
  FROM world a
  INNER JOIN world b
    ON b.name = a.name

或使用'隐含'连接样式

SELECT a.name, 
       a.continent, 
       a.population, 
       case 
         when b.population = 'high' then 'no'    
         else 'yes' 
       end "move there?"
  FROM world a,
       world b
  WHERE b.name = a.name

祝你好运。

答案 1 :(得分:0)

显式加入和开启

SELECT a.name, 
    a.continent, 
    a.population, 
    case 
      when b.population = 'high' then 'no'    
      else 'yes' 
    end "move there?"
FROM world a
  inner join world b
     on b.<col> = a.<col>