我有一个包含以下属性的表:
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,但是我不能让它给那些只能与来自印度的球员比赛的球员。我不想要那些与印度对战的球员
有人可以帮我解决问题吗?我完全错了吗?
答案 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)
)