我在Oracle SQL中有一个问题。
为了简化我的问题,假设我有两个表:
TAB1: TAB2:
Usr Fruit Fruit Calories
1 A A 100
1 A B 200
1 A C 150
1 C D 400
1 C E 50
2 A
2 A
2 E
TAB1中有双重条目非常重要。 现在我想知道usr的卡路里1.但是加入两个表
SELECT TAB2.calories from TAB1
JOIN TAB2 ON TAB1.Fruit = TAB2.Fruit
WHERE TAB1.Usr = 1;
我获得双重条目的双重结果。我当然可以在标题中使用distinct,但是有可能直接在连接中区分值(到A和C)吗?我相信这会改善我(更大)的表现。
谢谢!
答案 0 :(得分:5)
我是半连接的忠实粉丝。对于这么小的桌子,它不重要,但对于较大的桌子,它可以产生很大的不同:
select
tab2.calories
from tab2
where exists (
select null
from tab1
where tab1.fruit = tab2.fruit and tab1.usr = 1
)
答案 1 :(得分:1)
试试这个:
SELECT TAB2.calories
from (select distinct usr, fruit from TAB1) as T1
JOIN TAB2 ON T1.Fruit = TAB2.Fruit
WHERE T1.Usr = 1;
答案 2 :(得分:1)
你应该在加入
之前做出明确的决定select sum(tab2.calories) as TotalCalories
from (select distinct tab1.*
from tabl
) t1 join
tab2
on t1.fruit = tab2.fruit
where t1.user = 1;
此外,要添加值,请使用聚合函数。
答案 3 :(得分:1)
因为您在tabA中没有选择任何内容,也许您有一些有用的索引,我会选择IN
代替联接
SELECT TAB2.calories
FROM TAB2
WHERE TAB2.Fruit IN ( SELECT TAB1.Fruit FROM TAB1 WHERE TAB1.Usr = 1)
我很确定这个会花费更长的时间,但您仍然可以尝试:
SELECT TAB2.calories
FROM TAB2
WHERE TAB2.Fruit IN ( SELECT DISTINCT TAB1.Fruit FROM TAB1 WHERE TAB1.Usr = 1)