Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 异联_Sql_Oracle_Join_Distinct - Fatal编程技术网

Sql 异联

Sql 异联,sql,oracle,join,distinct,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

我对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中有两个条目是很重要的。 现在我想知道USR1的卡路里。但是通过加入两个表

SELECT TAB2.calories from TAB1
JOIN TAB2 ON TAB1.Fruit = TAB2.Fruit
WHERE TAB1.Usr = 1;
对于双重输入,我得到双重结果。我当然可以在标题中使用distinct,但是有没有可能直接在连接中区分值(到a和C)?我相信这会提高我(更大)的表现

谢谢

试着这样做:

SELECT TAB2.calories 
 from (select distinct usr, fruit from TAB1) as T1
        JOIN TAB2 ON T1.Fruit = TAB2.Fruit
WHERE T1.Usr = 1;

您应该在连接之前执行distinct

select sum(tab2.calories) as TotalCalories
from (select distinct tab1.*
      from tabl
     ) t1 join
     tab2
     on t1.fruit = tab2.fruit
where t1.user = 1;

另外,要添加值,请使用聚合函数。

因为您在tabA中没有选择任何内容,并且可能有一些有用的索引,所以我选择在中使用
而不是join

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)

我是半决赛的超级粉丝。对于这么小的表,这无关紧要,但对于较大的表,这可能会产生很大的不同:

select
  tab2.calories
from tab2
where exists (
  select null
  from tab1
  where tab1.fruit = tab2.fruit and tab1.usr = 1
)

如果用户吃/用了三次水果,不是热量的三倍吗?你的意思是如果我在4种药剂中吃了800克巧克力,只算200克?为什么在表1中重复输入很重要?如果USR13次吃水果A,那么卡路里是300。准确的结果是否也“重要”?我被告知(但不知道第一手资料)首选第一种方法,因为如果需要,CBO会将其优化为半联接,从而消除与不同类型关联的分组/排序。就结果而言,它们肯定会产生相同的结果results@Hambone是的,我的评论不是很清楚。也许这是失礼,但我很好奇为什么这个答案被否决了。该解决方案将起作用,经过适当解释,并且是有效的。如果有人能解释,我想知道,为了我自己的教育,这个回答有什么问题。这是我不得不说的一个很好的解决办法+1 :)