我有两张很容易加入的桌子,第三张给我带来了麻烦。首先,表格:
tbl_customer
id dt value group
a 2013-01-01 10 cavalry
a 2012-06-01 20 lance
a 2011-03-01 10 infantry
b 2013-01-01 20 court
b 2012-07-01 5 maiden
b 2005-06-01 10 chivalry
tbl_title
id dt_active dt_inactive title
a 2001-01-01 2012-01-01 mister
a 2012-01-02 3001-01-01 sir
a 2012-01-02 3001-01-01 king
b 2001-01-01 2012-01-01 miss
b 2012-01-02 3001-01-01 lady
b 2012-01-02 3001-01-01 queen
使用以下方法很容易加入以返回给定 ID 的标题:
SELECT
id, dt, value, title
FROM
tbl_customer AS cust
INNER JOIN tbl_title AS titles
ON titles.id = cust.id
AND dt >= titles.dt_active
AND dt <= titles.dt_inactive
这将返回tbl_customer
包含多个“活动”标题的重复行中的所有行。例如,第一行tbl_customer
返回两次,一次是“king”,一次是“sir” title
。
我有第三个表将组链接到标题。它可以帮助解决这些关系:
tbl_group
group title rank
cavalry sir 10
lance king 20
infantry mister 30
court lady 10
court queen 20
maiden lady 10
chivalry miss 5
然后我可以加入表格以包含标题tbl_group
并将结果限制为匹配的结果:
SELECT
id, dt, value, titles.title
FROM
tbl_customer AS cust
INNER JOIN tbl_title AS titles
ON titles.id = cust.id
AND dt >= titles.dt_active
AND dt <= titles.dt_inactive
INNER JOIN tbl_group AS group
ON group.group = cust.group
WHERE
titles.title = group.title
这在很大程度上解决了我的问题。第三个表有助于消除 . 中存在多个“活动”记录时的歧义tbl_title
。
但是,有一个问题。第三个表也可以有多个与组关联的标题。因此,最终输出中仍然可能存在重复。在上面的示例中,“骑兵”明确地与“先生”头衔相关联。但是,组“法院”可以是“女士”或“女王”,tbl_title
也没有任何帮助,因为“女士”和“女王”都在tbl_customer
.
在这一点上,我除了“排名”之外别无选择tbl_group
。“女王”的排名比“女士”高 20 到 10,所以我想在tbl_customer
. 如果排名相等,我只想使用tbl_group
. (这可以通过某种内部排序来解决吗?)
棘手的部分是在排名之前需要考虑活动/非活动动态。例如,我不想首先过滤tbl_group
每个组的一个标题,因为这会阻止基于日期的可能匹配。
理想情况下,我需要从显示标题的每个条目返回一行tbl_customer
,首先基于活动/非活动日期。接下来,我想使用tbl_group
. tbl_customer
最后,我想在使用 match 和 rank from时将结果限制为每个条目仅一行tbl_group
。这甚至可能吗?