使用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
答案 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>