您可以在同一联接上为多行返回不同的值吗?
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...)以上是关于您可以在同一联接上为多行返回不同的值吗?的主要内容,如果未能解决你的问题,请参考以下文章
您可以从 Redshift 中的 python UDF 返回多个值吗?