1

我有一个表,其中有几个零件号列: PN1, PN2, PN3, otherData

我想创建一个高效的 MySQL 查询,它将零件编号列折叠到一个称为PN将零件编号链接到 otherData 的列中。

这种转换对于我们的业务逻辑是必要的。我在下面有一个可以正常工作的查询,但我们需要大幅提高性能。

有没有更好的方法来执行以下操作?

SQL Query 可以正确转换数据,但效率低下:

SELECT 'Pn', 'Mfg', 'TableId', 'SourceColumn', 'OtherData'
SELECT PN1, Mfg, '26', 'PN1', OtherData FROM Table
UNION ALL
SELECT PN2, Mfg, '26', 'PN2', OtherData FROM Table
UNION ALL
SELECT PN3, Mfg, '26', 'PN3', OtherData FROM Table
UNION ALL
SELECT PN4, Mfg, '26', 'PN4', OtherData 
INTO OUTFILE 'XXX.dat'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
FROM Table d;

输入表如下表所示:

|  PN1  |  PN2  |  PN3    |  PN4    |  MFG  |  TableId  |  OtherData  |
-----------------------------------------------------------------------
|  asdf |  abde |  12354  |  asdfc  |  2    |  26       |  0.2456     |
|  nupo |  1354 |  null   |  null   |  2    |  26       |  1.53       |
|  ...  |  ...  |  ...    |  ...    |  ...  |  ...      |  ...        |
|  ...  |  ...  |  ...    |  ...    |  ...  |  ...      |  ...        |
|  ...  |  ...  |  ...    |  ...    |  ...  |  ...      |  ...        |

我希望输出.dat文件如下所示:

"Pn",    "Mfg", "TableId",  "SourceColumn","OtherData"
"asdf",  2,     26,         "PN1",         0.2456
"abde",  2,     26,         "PN2",         0.2456
"12354", 2,     26,         "PN3",         0.2456
"asdfc", 2,     26,         "PN4",         0.2456
"nupo",  2,     26,         "PN1",         1.53
"1354",  2,     26,         "PN2",         1.53
...

请注意,PN1 到 PN4 被折叠成 PN。

有没有更快的方法在 MySQL 中进行这种转换?

4

1 回答 1

1

我在数据库管理员页面下交叉发布了这个问题

https://dba.stackexchange.com/questions/35514/better-query-to-select-multiple-columns-into-a-single-output-column

看来查询是(至少对于 MySQL)我暂时能做的最好的。如果 MySQL 曾经实现对PIVOT/的支持,UNPIVOT那么应该重新审视这个问题。

于 2013-03-01T19:13:30.857 回答