您可以在同一联接上为多行返回不同的值吗?

Posted

技术标签:

【中文标题】您可以在同一联接上为多行返回不同的值吗?【英文标题】:Can you return different values for multiple rows on the same join? 【发布时间】:2011-03-10 16:23:36 【问题描述】:

我有两张桌子:

家长信息

儿童信息

两者的结构(几乎)相同,但有一些细微差别。

表结构如下:

家长

ID   |   First   |   Last   |   DOB       |   Address
-------------------------------------------------
1    |   John    |   Doe    | 1980-01-01  |   123 street

家属

ParentID   |    Type   |    First   |   Last    |    DOB
--------------------------------------------------
1    |   Spouse  |    Jane    |    Doe    |   1981-02-01
1    |   Child   |    Mike    |    Doe    |   1999-08-01
1    |   Child   |    Zoe     |    Doe    |   2002-04-01

我想构建一个查询(理想情况下,带有连接的单个调用会返回以下内容:

表格结果

First   |    Last    |    Type    |    DOB        |     Address
---------------------------------------------------------------- 
John    |    Doe     |    Parent  |  1980-01-01   |   123 Street
Jane    |    Doe     |    Spouse  |  1981-02-01   |   123 Street
Mike    |    Doe     |   Child    |  1999-08-01   |   123 street
Zoe     |    Doe     |   Child    |  2002-04-01   |   123 Street

我想我可以在从属表上使用 LEFT JOIN 构建最初的子查询(并非所有父母都有从属),然后运行一个过滤该表的主查询,但是 - 当我这样做时,查询会占用一整分钟生产。 (我的表每天更改数百次,因此保留表的索引并不是一个真正的选择,因为我必须不断地重建)。

更新

我想得越多,即使是左连接也不一定有效,因为父信息和第一组依赖信息将驻留在子查询的同一行中(这反过来又使主查询“不可能”将单行过滤成多行)。

有什么想法吗?

【问题讨论】:

父母和家属之间的连接字段是什么?我希望在 Dependents 中看到 ParentID 字段......而且我很确定索引会自行重建,您不必自己重建它们。 @Bobby - 我在我的回答中提到了左连接 - 无论如何,左连接也会返回重复数百次的第一条记录的结果集 - 不是我想要的 @Leslie - 抱歉我的字段标记错误,家属被映射到具有父母主 ID 的父母 - 而且 - 我的理解是索引不会根据我所看到的一切重建自身。我不一定希望每次对具有 20,000 条记录的表进行修改时都进行索引重建 【参考方案1】:
SELECT t.First, t.Last, t.Type, t.DOB, t.Address
    FROM (SELECT ID, First, Last, 'Parent' as Type, DOB, Address, 1 as SortKey
             FROM Parent
          UNION ALL
          SELECT p.ID, d.First, d.Last, d.Type, d.DOB, p.Address, 
                 CASE WHEN d.Type = 'Spouse' THEN 2 ELSE 3 END as SortKey
              FROM Dependents d
                  INNER JOIN Parent p
                      ON d.ParentID = p.ID) t
    ORDER BY t.ID, t.SortKey

【讨论】:

感谢您的帮助 - 我应该记住工会但感谢您的帮助 能否使用相同的格式对结果集实施“计数器”规则? (父母始终为 1,配偶(如果存在)始终为 2,孩子(如果存在)将不断增长,直到没有该特定父母的更多记录 (3,4,5,6...)

以上是关于您可以在同一联接上为多行返回不同的值吗?的主要内容,如果未能解决你的问题,请参考以下文章

RSpec stubbed方法可以按顺序返回不同的值吗?

您可以从 Redshift 中的 python UDF 返回多个值吗?

integer定义的值可以赋给int定义的值吗?

NSString 散列在不同版本的 iOS(不是 OS X)中具有相同的值吗?

std::sort 总是比较相等的值吗?

memcached的设计是否有所不同,以便更好地处理较大的有效负载?是多线程使它更适合于较大的值吗?