SQL - 连接的JOIN / UNION的JOIN

时间:2017-10-21 09:57:51

标签: sql join union

考虑以下代表体育俱乐部的SQL数据库架构:Bug 526054

父母(父母)有孩子(KID)是团队(TEAM)成员(成员)。父母也可以是团队管理员(ADMIN)。请注意:

  • 管理员不需要团队中的孩子;
  • 团队中有孩子的父母不是团队管理员;
  • 孩子们可能在几个团队中。

给定PARENT.id_parent,如何选择链接到此父级(管理员,父级或两者)的TEAM.id_team列表。每个TEAM.id_team必须是唯一的,即使父母在团队中有孩子并且是管理员。

以下内容为我提供了通过儿童与父母联系的团队:

SELECT DISTINCT TEAM. * 
FROM TEAM
INNER JOIN MEMBERS ON MEMBERS.id_team = TEAM.id_team
INNER JOIN KID ON KID.id_kid = MEMBERS.id_kid
WHERE KID.id_parent = 1

这个给了我父母是管理员的团队:

SELECT DISTINCT TEAM . * 
FROM TEAM
INNER JOIN ADMIN ON ADMIN.id_team = TEAM.id_team
WHERE ADMIN.id_parent = 1

但我不知道如何获得两者的联合(或加入?)。

1 个答案:

答案 0 :(得分:1)

这可能不是一种优化的方式(要做到这一点,我需要知道数据库中的表大小和其他细微差别)。但我认为这会给你所需要的东西(因为你不需要团队名称)

In [86]: a = [3, 4, 2, 1, 7, 6, 5]
    ...: b = [4, 6]
    ...:

In [87]: %timeit min(map(a.index, b))
    ...:
608 ns ± 64.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [88]: bset = set(b)
    ...:

In [89]: %timeit next(i for i, v in enumerate(a) if v in bset)
    ...:
717 ns ± 30.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)