2015-12-29 36 views
0

由于现有的数据库模式设计不正确,我必须以特殊方式编写select语句,如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 
... 

select语句的我想要的输出结果是一样的东西对于一个给定的ID如下:

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

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

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

+0

请编辑您的问题,并提供样品数据和预期结果。 –

回答

0
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; 
+0

感谢您的建议。但它不能运行。 ON附近有语法错误。我之前没有看到通过SELECT加入JOIN。 – TeeKai

+0

什么是确切的错误?你在复制/粘贴上面的内容吗?该声明在语法上是正确的。 – Lock

+0

我有一个数据库名称在Child前面,有些东西喜欢db_foo.Child,在行“Child ON”作为查询语句的其余部分使用的表名引用。这会导致语法错误。删除数据库名称后,查询成功运行。我还发现它不会在行上使用表别名。非常感谢您的帮助。 – TeeKai