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

时间:2011-03-10 16:23:37

标签: mysql subquery

我有两张桌子:

家长信息

儿童信息

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

表格结构如下:

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

我想我可以在dependents表上构建一个带有LEFT JOIN的原始子查询(并非所有父项都有依赖项)然后运行一个过滤该表的主查询,但是 - 当我这样做时,查询需要一整分钟生产。 (我的表每天更改数百次,因此保留表的索引并不是一个选项,因为我必须不断重建)。

更新

我对它的思考越多,即使左连接也不会起作用,因为父信息和第一组依赖信息将驻留在子查询的同一行上(反过来使主查询'不可能'将单行过滤为多个。)

有什么想法吗?

1 个答案:

答案 0 :(得分: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