加入DISTINCT

时间:2015-10-08 11:56:18

标签: sql oracle join distinct

我在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)吗?我相信这会改善我(更大)的表现。

谢谢!

4 个答案:

答案 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)