MySQL 5.7-使用非规范化表取消透视和展平层次数据集

时间:2018-07-13 04:22:04

标签: mysql sql recursion

我有两个表,约会(称为SOAppts)和过程代码(称为SOProccodes)。约会表是牙科数据集的一部分,其中包含有关对患者进行的操作的说明。这些引用存储在SOApptscodeid列中。这些列中有20列(从codeid1codeid20),在小提琴中可以看到其中的五列。

http://sqlfiddle.com/#!9/9cfef0/2

codeid引用SOProccodes表,该表存储有关该过程的实际信息。 SOProccodes表条目由过程代码ID(proccodeid),类别(category)和描述(descript)组成。 proccodeid也可以包含对多个其他过程代码(以下称为多代码)的引用。

多代码由999的category表示,并且multicodeXid列中的条目可以引用其他过程代码或什至其他多代码。一个多代码最多可以引用8个过程代码和/或其他多代码的组合。

鉴于此信息,我该如何以以下方式检索信息:数据不被透视(所有codeid列都传输到行中),层次结构被展平并且在查询中看到多代码所引用的所有过程代码约会表?我已经尝试过将这些表连接在一起,但是查询很容易超出MySQL的61表连接限制,这一事实使这个想法陷入了混乱。

apptid  codeid1 codeid2 codeid3 codeid4
22769   1       17      783     725 
22891   1       15      55      679
22892   1       55      58      627
22893   1       783     725     18

在此示例中,apptid 22769的多重代码为725。

select * from SOProccodes where proccodeid = 1, 720, 725

procco descript  category            multinumof multicode1id multicode2id multicode3id multicode4id multicode5id
1      Periodic  1                   0          0            0            0            0            0           
720    Fluoride  2                   0          0            0            0            0            0           
725    Adult Flu 999                 1          720          0            0            0            0           

我希望显示720而不是725,所以看起来像这样。

apptid  codeid
22769   1       
22769   17
22769   783
22769   720

对于引用其他多代码的多代码,我想将所有这些代码输出到它们自己的行中。例如,约会22892:

22892   1       55      58      627

具有proccode 627,这是一个多代码,在常规过程代码中,它引用了另一个622的多代码

select * from SOProccodes where proccodeid = 627, 622

procco descript           category            multinumof multicode1id multicode2id multicode3id multicode4id multicode5id
622    Cont. Care - Proph 999                 3          54           17           1            0            0           
627    Cont. Care - Compr 999                 5          35           30           33           8            622         

所以,它应该看起来像这样(proccodeid 627的所有过程代码和627的孩子的所有过程代码622)

apptid    codeid
22892   1       
22892   55      
22892   58      
22892   35           
22892   30           
22892   33           
22892    8   
22892   54
22892   17          
22892   1       

0 个答案:

没有答案