如何在SQL oracle中自然连接然后从这个表中选择

时间:2015-03-03 18:21:21

标签: sql-server oracle natural-join

我有一个包含以下属性的表:

 Table1(tid, p_name, country)
 Table2(pid1, pid2, match_start, goals1, goals2)

我插入了一些随机值。

  

找出所有来自玻利维亚的球员的名字   来自印度的球员。确保没有返回重复的名称。

我一直在考虑这样做:

SELECT DISTINCT p_name
FROM Table1 NATURAL JOIN Table2
WHERE (
         (Table1.tid = Table2.pid1 or 
          Table1.tid = Table2.pid2 and 
           Table1.country = 'India') and 
       Table1.country = 'Bolivia')

我得到了一张桌子,其中包含与玻利维亚国家相关的所有p_names,但是我不能让它给那些只能与来自印度的球员比赛的球员。我不想要那些与印度对战的球员

有人可以帮我解决问题吗?我完全错了吗?

3 个答案:

答案 0 :(得分:0)

是的,你完全错了。

NATURAL JOIN毫无意义:Table1,Table2之间没有共同的列名 - 正如ruudvan所质疑的那样。你可能还有

FROM Table1,Table2 在哪里......

要解决这个问题,你需要有效地获得Table1的两个副本 - 一个用于主队(tid = pid1),一个用于客队(tid = pid2)。然后筛选匹配玻利维亚在家到印度或印度在家到玻利维亚。然后从玻利维亚团队投射p_name。 (那将是来自主场和客场比赛的两套p_name。)UNION DISTINCT两套。

答案 1 :(得分:0)

我会用一个与EXISTS相关的子查询来构建它,因为你真正想要的是一个玩家列表,这个国家是'玻利维亚',与“印度”团队存在匹配。

我的数据模型对我来说并不清楚,它可能已经简化了,因为我希望看到一个团队表,一个玩家表,一个匹配表和一个表的角色。球员参加比赛('打','替换未使用','替换使用',那种事情。)

您应始终怀疑是否需要对查询执行DISTINCT操作。我并不是说它总是不正确,但它经常指向数据模型的问题,或者补偿结构不良的查询的方法。

答案 2 :(得分:0)

这是一种不同的方法。

获得两份Table1,一份给玻利维亚,一份给印度。然后在家中过滤玻利维亚到印度(B.tid = pid1和I.tid = pid2)或玻利维亚到印度(B.tid = pid2和I.tid = pid1)。玻利维亚项目p_name:

SELECT DISTINCT B.p_name
FROM Table1 B, Table2, Table1 I
WHERE B.country = 'Bolivia'
  AND I.country = 'India'
  AND (   (B.tid = pid1 AND I.tid = pid2)
       OR (B.tid = pid2 AND I.tid = pid1)
      )