【问题标题】:To retrieve data from parent-child tables in a flat data set从平面数据集中的父子表中检索数据
【发布时间】:2015-12-29 22:40:52
【问题描述】:

由于现有的数据库架构设计不佳,我必须以this thread 中所示的特殊方式编写选择语句。

SELECT MAX(CASE WHEN Name = 'C' THEN RelativePath END) AS C,
   MAX(CASE WHEN Name = 'CC' THEN RelativePath END) AS CC,
   MAX(CASE WHEN Name = 'S' THEN RelativePath END) AS S,
   MAX(CASE WHEN Name = 'SC' THEN RelativePath END) AS SC,
   MAX(CASE WHEN Name = 'R' THEN RelativePath END) AS R,
   MAX(CASE WHEN Name = 'RC' THEN RelativePath END) AS RC
FROM myTable
WHERE ID = pId;

现在,我需要将其输出与其父表的 select 语句的输出连接起来。父子表的结构如下:

Parent
-------------------
id    -> the primary key
third_party_id
createdBy
createdDate
...

Child
-------------------
id -> the primary key of its Parent table
Name 
...

对于给定的 id,我想要的 select 语句的输出结果类似于以下内容:

third_party_id, createdBy, createdDate, C, CC, S, SC, R, RC

子表可能没有给定父表键的条目。我使用左连接的选择语句,但无法获得所需的结果。数据库是 mySQL。

如果单个select语句不起作用,如何为输出构造存储过程?

【问题讨论】:

  • 请编辑您的问题并提供示例数据和所需结果。

标签: mysql sql stored-procedures


【解决方案1】:
SELECT
  Parent.third_party_id,
  Parent.createdBy,
  Parent.createdDate,
  Child.C,
  Child.CC,
  Child.S,
  Child.SC,
  Child.R,
  Child.RC
FROM
  Parent
LEFT OUTER JOIN
(
  SELECT 
     ID,
     MAX(CASE WHEN Name = 'C' THEN RelativePath END) AS C,
     MAX(CASE WHEN Name = 'CC' THEN RelativePath END) AS CC,
     MAX(CASE WHEN Name = 'S' THEN RelativePath END) AS S,
     MAX(CASE WHEN Name = 'SC' THEN RelativePath END) AS SC,
     MAX(CASE WHEN Name = 'R' THEN RelativePath END) AS R,
     MAX(CASE WHEN Name = 'RC' THEN RelativePath END) AS RC
  FROM myTable
  GROUP BY ID
) Child ON
  Child.ID = Parent.ID
WHERE
  Parent.ID = pId;

【讨论】:

  • 感谢您的建议。但是它无法运行。 ON 附近有语法错误。我之前没有看到 SELECT 跟随 JOIN。
  • 确切的错误是什么?你是在复制/粘贴上面的内容吗?该语句在语法上是正确的。
  • 我在 Child 前面有一个 DB 名称,类似于 db_foo.Child,位于“Child ON”行,作为查询语句其余部分中使用的表名引用。这会导致语法错误。删除数据库名称后,查询成功运行。我还发现它不需要表别名就行了。非常感谢您的帮助。