0

我有一个具有以下属性的表:

 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,但我不能让它给我只与来自印度的球员交手的球员。我不想要那些没有和印度比赛过的球员

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

4

3 回答 3

0

我会使用 EXISTS 相关子查询来构建它,因为您真正想要的是一个国家/地区为“玻利维亚”的球员列表,其中存在与球队“印度”的比赛。

你的数据模型对我来说不是很清楚,它可能已经简化了,因为我希望看到一张球队表格,一张球员表格,一张比赛表格,以及每个球员扮演的角色表格比赛('播放','替代未使用','替代使用',诸如此类)。

您应该始终怀疑是否需要对查询执行 DISTINCT 操作。我并不是说它总是不正确的,但它通常表明数据模型存在问题,或者是一种补偿结构不佳的查询的方法。

于 2015-04-10T09:47:12.407 回答
0

是的,你完全错了。

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

从表 1、表 2 哪里...

为了解决这个问题,您实际上需要获取 Table1 的两份副本——一份用于主队(tid = pid1),一份用于客队(tid = pid2)。然后筛选匹配玻利维亚主场与印度或印度主场迎战玻利维亚。然后从玻利维亚团队项目 p_name。(这将是来自主客场比赛的两组 p_name。) UNION DISTINCT 两组。

于 2015-04-10T09:22:13.003 回答
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)
      )
于 2015-04-12T08:48:54.953 回答