我的编程空间,编程开发者的网络收藏夹
学习永远不晚

省去跨表联查与注释查询的存储过程

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

省去跨表联查与注释查询的存储过程

省去跨表联查与注释查询的存储过程

 问题:

  传统的select * from table 存在以下几个问题:

        1.字段含义及“魔法数字”需要另开窗口对照查看,例如status有1,2,3,4,5

        2.外键字段引用的是对方表的id,要知道id对应信息,需要另开窗口查询,或者写跨表联查语句。例如:该订单对应的合作方具体信息是什么

        3.该记录被其他表引用了的情况也需要另外进行查询。例如:该合作方有多少订单及详情。

 解决方案:

  编写存储过程。

  1.将字段comment内容输出在表头位置;

  2.对于该表中的外键字段,去对应的表中查出外键对应的记录详情展示出来;

  3.其他表当做外键引用了该表时,将这些表表中的记录查出来,兼顾效率in_sub_limit 限制结果集,因为:该表可能被被其他N个表当外键引用,每个表对应又有百万条记录;

  总结:去除跨表联查,正向反向被引用的记录查出来。

 

高级查询工具用法:
tbl_query
( in_var                       [要查询的表]
,in_col                         [需要查询的字段,*代表全部,可定制,形如:"id,name,code"]
,in_where                    [where条件,支持limit]
,in_sub_limit                [子查询limit限制条数] )

 

  1 -- 打印query存储过程的帮助信息
  2 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
  3 DROP PROCEDURE IF EXISTS tbl_query_help;
  4 DELIMITER %%
  5 CREATE PROCEDURE tbl_query_help() 
  6 BEGIN
  7  CALL tbl_query("","","","");
  8 END %%
  9 DELIMITER ;
 10 
 11 
 12 -- --------------------------------------------------------------------------
 13 --  作者:王李峰
 14 --  功能:高级查询,去除跨表联查
 15 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
 16 -- --------------------------------------------------------------------------
 17 DROP PROCEDURE IF EXISTS tbl_query;
 18 DELIMITER %%
 19 CREATE PROCEDURE  tbl_query( in_var VARCHAR ( 255 ),in_col VARCHAR(1024),in_where VARCHAR(1024) ,in_sub_limit VARCHAR(1024)) 
 20 label:BEGIN
 21 
 22 SET group_concat_max_len = 4294967295;
 23 
 24 DROP TABLE IF EXISTS 
 25 test_main_tbl_col,
 26 test_child_tbl,
 27 test_child_tbl_col;
 28 
 29 SET @main_tbl = in_var;
 30 SET @in_sub_limit=in_sub_limit;
 31 SET @main_tbl_if_all = "yes";
 32 SET @in_where=in_where;
 33 
 34 --  如果输入的表名是空,则打印帮助信息-----------------------------------------------------------------------------------------------------------
 35 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
 36 if(@main_tbl IS NULL OR @main_tbl="") then
 37    SELECT "作者:王李峰" AS col, "功能:高级查询,无须跨表联查" AS col ,"前提:要有外键,该工具自动匹配外键进行" AS col
 38    UNION all
 39     SELECT "" AS col ,"" AS col ,"" AS col
 40    UNION ALL 
 41    SELECT "全部表tbl_query语句" AS col, "参数提示","" AS col
 42    UNION all
 43     SELECT
 44         (
 45         SELECT GROUP_CONCAT( 
 46                 CONCAT_WS(""
 47             ,"-- 表注释: ",t1.TABLE_COMMENT,"
"
 48             ,"-- 用法: tbl_query( in_var[要查询的表] ,in_col[需要查询的字段] ,in_where[where条件,支持limit]  ,in_sub_limit[子查询limit限制条数] ) 
"
 49             ,"-- 字段列表: ",((SELECT GROUP_CONCAT(t.COLUMN_NAME) FROM information_schema.columns t WHERE  t.TABLE_SCHEMA= DATABASE() and t.TABLE_NAME=t1.TABLE_NAME)),"
"
 50             ,"call tbl_query("",t1.TABLE_NAME,"","*"," where 1=1 limit 50","32"",");") 
 51         SEPARATOR "

") 
 52             FROM
 53                 information_schema.tables t1
 54             WHERE
 55                   t1.table_schema=  DATABASE() 
 56         ) AS col 
 57         ,"tbl_query( in_var[要查询的表] ,in_col[需要查询的字段] ,in_where[where条件,支持limit]  ,in_sub_limit[子查询limit限制条数] ) " AS col
 58         ,"ps:1.in_sub_limit参数子查询中limit限制数字一般是8的倍数,例如:32 
2.in_where参数中支持针对in_var参数输入的表自定义where语句" AS col
 59     UNION all
 60     SELECT "" AS col ,"" AS col ,"" AS col
 61     UNION ALL 
 62     SELECT "表名" AS col ,"调用方式" AS col ,"表所有字段注释" AS col
 63     UNION ALL 
 64     SELECT 
 65     t1.TABLE_NAME
 66     
 71     ,(
 72        SELECT  
 73             CONCAT_WS(""
 74             ,"-- 表注释: ",t2.TABLE_COMMENT,"
"
 75             ,"-- 用法: tbl_query( in_var[要查询的表] ,in_col[需要查询的字段] ,in_where[where条件,支持limit]  ,in_sub_limit[子查询limit限制条数] ) 
"
 76             ,"-- 字段列表: ",((SELECT GROUP_CONCAT(t.COLUMN_NAME) FROM information_schema.columns t WHERE  t.TABLE_SCHEMA= DATABASE() and t.TABLE_NAME=t2.TABLE_NAME)),"
"
 77             ,"call tbl_query("",t2.TABLE_NAME,"","*"," where 1=1 limit 50","32"",");") 
 78         FROM
 79            information_schema.tables t2
 80         WHERE
 81            t2.table_schema=  DATABASE() AND t2.TABLE_NAME=t1.TABLE_NAME
 82      )
 83      
 93     ,(SELECT 
 94             CONCAT_WS("",""字段注释:"{
",
 95                 GROUP_CONCAT(
 96                     CONCAT_WS("",
 97                       CONCAT_WS( "",""",t.COLUMN_NAME,""")
 98                         ,repeat(" ",
 99                             (
100                                 (SELECT  MAX(length(CONCAT_WS( "",""",s.COLUMN_NAME,""")))  FROM information_schema.columns s WHERE s.TABLE_SCHEMA= DATABASE() and s.TABLE_NAME=t.TABLE_NAME)  
101                                  - 
102                                 LENGTH(CONCAT_WS( "",""",t.COLUMN_NAME,"""))
103                             )
104                         )
105                         
106                         ,CONCAT_WS(""," : "",t.COLUMN_COMMENT,""")
107                          -- -----------------------------------------------------
108                     )
109                 ORDER BY t.ORDINAL_POSITION SEPARATOR ",
"
110                 ),"
}"
111             ) 
112         FROM information_schema.columns t 
113         WHERE t.TABLE_SCHEMA = DATABASE() and t.TABLE_NAME=t1.TABLE_NAME
114     )
115     FROM information_schema.tables t1 
116     WHERE t1.table_schema=  DATABASE() ;
117    -- 打印完帮助信息,直接跳出程序
118     leave label;
119 END if;
120 
121 
122 -- -- 判断自定义字段------------------------------------------
123 SET @in_col=in_col;
124 -- 如果输入为空,则是默认全部字段
125 if(@in_col IS NULL OR @in_col="" OR @in_col="	" OR @in_col="*"OR @in_col=" *" OR @in_col="* " OR @in_col=" * " ) then  -- 防止用户无效输入,这个匹配"",两个单引号之间有任意个空格都能匹配
126     SET @main_tbl_if_all = "yes";
127 ELSE
128     SET @main_tbl_if_all = "no";
129     -- 输入id,name,code 转换为:"id","name","code"
130     SET @user_define_main_tbl_cols =CONCAT_WS("",""",REPLACE(@in_col,",","",""),""");
131 END if;
132 
133 -- SELECT @user_define_main_tbl_cols;
134 
135 
136 -- 建表---------------------------------------------------------------------
137 
138 CREATE TABLE IF NOT EXISTS `test_child_tbl` (
139   `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "主键",
140   `main_tbl_name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT "主表名",
141   `child_tbl_name` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT "字表名",
142   `main_tbl_foreign_key` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT "主表外键字段名,如user_uuid",
143   `ref_child_tbl_id` varchar(256) COLLATE utf8_bin DEFAULT NULL COMMENT "字表中被引用的键,如,user表中uuid",
144   PRIMARY KEY (`id`),
145   UNIQUE KEY `uni_test_child_tbl` (`main_tbl_name`,`main_tbl_foreign_key`)
146 )  COMMENT="测试:有哪些子表,即外键关联到的表";
147 
148 CREATE TABLE IF NOT EXISTS `test_child_tbl_col` (
149   `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "主键",
150   `child_tbl_name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT "字表名",
151   `col` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT "子表需要展示的字段",
152   `col_desc` VARCHAR(500) COLLATE utf8_bin DEFAULT NULL COMMENT "字段注释",
153   PRIMARY KEY (`id`),
154   UNIQUE KEY `uni_test_child_tbl_col` (`child_tbl_name`,`col`)
155 )  COMMENT="测试:字表中要展示的字段";
156 
157 CREATE TABLE IF NOT EXISTS `test_main_tbl_col` (
158   `id` int(10) NOT NULL AUTO_INCREMENT COMMENT "主键",
159   `main_tbl_name` varchar(200) COLLATE utf8_bin NOT NULL COMMENT "主表名",
160   `col` varchar(200) COLLATE utf8_bin NOT NULL COMMENT "主表需要展示的字段",
161   PRIMARY KEY (`id`),
162   UNIQUE KEY `uni_test_main_tbl_col` (`main_tbl_name`,`col`)
163 )  COMMENT="测试:主表中需要查询哪些字段";
164 
165 
166 -- 默认插入主表所有字段sql
167 SET @insert_tbl_all_cols = 
168 "INSERT ignore INTO test_main_tbl_col(main_tbl_name,col)
169     SELECT @main_tbl,t1.COLUMN_NAME
170     FROM  information_schema.COLUMNS t1
171     WHERE
172     t1.table_schema=  DATABASE() AND 
173     t1.TABLE_NAME =@main_tbl";
174     
175 -- 判断并插入:是默认插入所有字段,还是插入自定义字段
176 SELECT
177    IF
178     (
179        -- 如果是yes插入所有字段
180         @main_tbl_if_all = "yes",  
181         CONCAT_WS( "", @insert_tbl_all_cols, " order by t1.ORDINAL_POSITION " ),
182         -- 如果非yes,插入自定义字段
183         -- insert ingnore into test_main_tbl_col(main_tbl_name,col) values ("tbl_ams_activity_info","id"),("tbl_ams_activity_info","name"),("tbl_ams_activity_info","code")
184         CONCAT_WS("","insert ignore into test_main_tbl_col(main_tbl_name,col) values (",""",@main_tbl,"",",REPLACE(@user_define_main_tbl_cols, ",",CONCAT_WS("","),(",""",@main_tbl,""",",")),")")
185     ) 
186     INTO @insert_main_tbl_col;
187     
188 PREPARE stmt  FROM @insert_main_tbl_col;
189 EXECUTE stmt;
190 DEALLOCATE PREPARE stmt;
191 
192 
193 -- select @insert_main_tbl_col;
194 
195 -- 插入子表:按照外键找出所有子表名及关联的外键等字段
196 INSERT IGNORE INTO test_child_tbl ( main_tbl_name, child_tbl_name, main_tbl_foreign_key, ref_child_tbl_id ) 
197 SELECT * 
198 FROM
199 (
200     SELECT
201         t.TABLE_NAME AS tbl_name,
202         k.REFERENCED_TABLE_NAME AS rf_name,
203         k.column_name AS col_name,
204         k.REFERENCED_COLUMN_NAME AS rf_col 
205     FROM
206         information_schema.TABLE_CONSTRAINTS t
207         JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
208         AND t.TABLE_NAME = k.TABLE_NAME 
209         AND t.CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA 
210     WHERE
211         t.CONSTRAINT_TYPE = "FOREIGN KEY" 
212         AND t.table_schema = DATABASE()
213         AND k.CONSTRAINT_SCHEMA=DATABASE() 
214         AND t.TABLE_NAME = @main_tbl 
215 ) t;
216     
217 -- 把所有子表的所有col字段出并插入
218 INSERT IGNORE INTO test_child_tbl_col ( child_tbl_name, col, col_desc ) 
219 SELECT
220     t1.TABLE_NAME,
221     t1.COLUMN_NAME,
222     t1.COLUMN_COMMENT 
223 FROM
224     information_schema.COLUMNS t1 
225 WHERE
226     t1.table_schema = DATABASE ( ) 
227     AND t1.TABLE_NAME IN ( SELECT DISTINCT child_tbl_name FROM test_child_tbl ) 
228 ORDER BY t1.ORDINAL_POSITION;
229     
230 -- ---------------------------------------------------------------------------------------------------------------------------------    
231 -- ---------------------------------------------------------------------------------------------------------------------------------
232 -- ---------------------------------------------------------------------------------------------------------------------------------
233 -- ---------------------------------------------------------------------------------------------------------------------------------
234 -- ---------------------------------------------------------------------------------------------------------------------------------
235 -- ---------------------------------------------------------------------------------------------------------------------------------
236 
237 
238 
239 
240 -- set @main_tbl="tbl_ams_user_behavior";    
241 -- set @main_tbl="tbl_ams_raffle_activity";
242 -- set @main_tbl="tbl_ams_user_specific_behavior";
243 -- 根据外键找到主表被哪些表引用了。就是一对多的情况
244 SELECT 
245      group_concat(CONCAT_WS(""," @row_num_",tbl_name,"_",col_name,":= 0 , ") SEPARATOR " ") AS "@row_num_fk_tbl_name" 
246     ,group_concat(CONCAT_WS(""," , ",tbl_name,"_",col_name ) SEPARATOR " ")   AS  "@fk_tbl_name" 
247     ,if(group_concat(CONCAT_WS("","  %",tbl_name,"_",col_name,"% as ",tbl_name,"_",col_name ) SEPARATOR " , ") IS NULL,"",CONCAT_WS(""," , ",group_concat(CONCAT_WS("","  %",tbl_name,"_",col_name,"% as ",tbl_name,"_",col_name ) SEPARATOR " , ")))  AS "@fk_tbl_name_as"
248     ,group_concat(CONCAT_WS("",","被",tbl_name," : ",col_name," 引用 : ",tbl_comment,""") SEPARATOR " ")  AS "@fk_tbl_name_ref_header"
249     ,group_concat(CONCAT_WS("","@var_fk_",tbl_name,":=",rf_name,".",rf_col," , ") SEPARATOR " ")  AS "@var_fk_tbl_name"
250      INTO @row_num_fk_tbl_name,@fk_tbl_name,@fk_tbl_name_as,@fk_tbl_name_ref_header,@var_fk_tbl_name
251 FROM
252 (SELECT 
253       t.TABLE_NAME AS tbl_name,
254       k.column_name AS col_name,
255       k.REFERENCED_TABLE_NAME AS rf_name,
256       k.REFERENCED_COLUMN_NAME AS rf_col,
257       tb.TABLE_COMMENT AS tbl_comment
258   FROM
259      information_schema.TABLE_CONSTRAINTS t 
260   JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k 
261      ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
262   JOIN INFORMATION_SCHEMA.tables tb
263      ON tb.TABLE_NAME=t.TABLE_NAME
264      AND t.TABLE_NAME = k.TABLE_NAME 
265      AND t.CONSTRAINT_SCHEMA=k.CONSTRAINT_SCHEMA
266      AND tb.TABLE_SCHEMA=DATABASE() AND k.CONSTRAINT_SCHEMA=DATABASE()
267     WHERE  t.CONSTRAINT_TYPE="FOREIGN KEY" AND t.table_schema =DATABASE() AND  k.REFERENCED_TABLE_NAME=@main_tbl
268 ) t;
269     
270     
271     
272 -- 主语句表头:前半部分 -打印出带注释的表头,必须limit 0形式:select * from ( select "xx","yy","kk" limit 0)  这样才能只剩余表头,没有数据
273 
280 SELECT 
281     CONCAT_WS("","select * from ( select ",group_concat(CONCAT_WS("",""",t1.COLUMN_NAME,"  : {",t1.COLUMN_COMMENT,"}"") order BY c.id),@fk_tbl_name_ref_header," limit 0 ) t ")  
282      INTO @select_cols_comment
283 FROM
284     information_schema.COLUMNS t1
285     JOIN test_main_tbl_col c ON c.col=t1.COLUMN_NAME
286 WHERE
287     t1.table_schema=  DATABASE() AND 
288     t1.TABLE_NAME =@main_tbl  ;
289 
290 -- SELECT @select_cols_comment;
291 
292 
299 SELECT CONCAT_WS("","  (select ",@row_num_fk_tbl_name,cols,@fk_tbl_name_as," from ",@main_tbl," ")  
300   into  @exec_sql 
301 from
302 (SELECT GROUP_CONCAT(col ORDER BY id) AS cols FROM test_main_tbl_col WHERE main_tbl_name=@main_tbl) t;
303 
304 -- SELECT @exec_sql;
305  
306 -- 将外键字段标识出来%xx% ,建表必须写as temp,@开头的字段名不合法
307 DROP TABLE if exists test_temp;
308 CREATE TABLE  test_temp as
309     SELECT @exec_sql:=REPLACE(@exec_sql,main_tbl_foreign_key,CONCAT_WS("","%",main_tbl_foreign_key,"%")) AS temp  
310     FROM test_child_tbl 
311     WHERE main_tbl_name=@main_tbl;
312 DROP TABLE if exists test_temp;
313 
323 SELECT CONCAT_WS(""," union all select ",cols,@fk_tbl_name," from  ",@exec_sql)  
324  into  @exec_sql 
325 from
326 (SELECT GROUP_CONCAT(col ORDER BY id) AS cols FROM test_main_tbl_col WHERE main_tbl_name=@main_tbl) t;
327 
328 
329 -- SELECT @exec_sql;
330 
331 -- 主语句
332 
350 SET @exec_sql=CONCAT_WS("",@select_cols_comment,@exec_sql);
351     
352 -- SELECT @exec_sql;
353     
354     
355 -- 替换组主语句中被%xx%标识出来的外键字段为子查询    
356 DROP TABLE IF    EXISTS test_temp;
357 CREATE TABLE if NOT exists test_temp AS 
358 SELECT
359     @exec_sql := REPLACE (
360         @exec_sql,  -- 原始值主语句
361         CONCAT_WS( "", "%", main_tbl_foreign_key, "%" ), -- 要替换的对象,及被%xx%标记的外键字段
362         CONCAT_WS( "", query_ref_tbl_info, " as ", main_tbl_foreign_key ) -- 替换为子查询
363         ) AS temp 
364 FROM
365     (
366         SELECT
367             CONCAT_WS("","(CONCAT_WS("",","(","select concat_ws("","{",trim(", 
" from replace(group_concat(",
368                      cols,"),"$","\"")),"}") from ",child_tbl_name," where ",ref_child_tbl_id," = ",main_tbl_name,".",
369                       main_tbl_foreign_key,")",","\r\n\r\n",cols_desc,""))" 
370             ) AS query_ref_tbl_info,  
371             t.* 
372         FROM
373             (SELECT test_child_tbl.*
374                         ,
375                         (SELECT    GROUP_CONCAT(
376                                                 CONCAT_WS("",
377                                                     CONCAT_WS( "", ""$", col, "$" ),
378                                                     -- 打印对齐空格
379                                                     REPEAT(" ",
380                                                                 (
381                                                                     ( SELECT MAX( length( CONCAT_WS( "", ""$", col, "$" ) ) ) FROM test_child_tbl_col WHERE child_tbl_name = t.child_tbl_name ) 
382                                                                     - 
383                                                                     LENGTH( CONCAT_WS( "", ""$", col, "$" ) ) 
384                                                                 ) 
385                                                             ),
386                                                     CONCAT_WS( "", " : $",ifnull(", col, "," ")", ","$, 
"" ) 
387                                                 ) ORDER BY id SEPARATOR ",
" 
388                                     ) 
389                         FROM test_child_tbl_col t 
390                         WHERE child_tbl_name = test_child_tbl.child_tbl_name 
391                         ) AS cols
392                         ,
393                         (SELECT    CONCAT_WS("",""字段注释:"{
",
394                                                 GROUP_CONCAT(CONCAT_WS("",
395                                                                 CONCAT_WS( "", """, t.col, """ ),
396                                                                REPEAT(" ",
397                                                                             (
398                                                                                 ( SELECT MAX( length( CONCAT_WS( "", """, col, """ ) ) ) FROM test_child_tbl_col WHERE child_tbl_name = t.child_tbl_name ) 
399                                                                                 - 
400                                                                                 LENGTH( CONCAT_WS( "", """, t.col, """ ) ) 
401                                                                             ) 
402                                                                     ),
403                                                                 CONCAT_WS( "", " : "", t.col_desc, """ ) 
404                                                                 ) 
405                                                 ORDER BY id SEPARATOR ",
" 
406                                                 ),
407                                                 "
}" 
408                                     ) 
409                         FROM test_child_tbl_col t 
410                         WHERE child_tbl_name = test_child_tbl.child_tbl_name 
411                         ) AS cols_desc 
412             FROM test_child_tbl 
413             WHERE main_tbl_name = @main_tbl 
414             ) t 
415     ) tt;
416             
417         DROP TABLE IF EXISTS test_temp;
418         
419         
420 
421         
422         
423 -- ----------------------------------------------------------------------
424 -- ----------------------------------------------------------------------
425 -- ----------------------------------------------------------------------        
426 -- 找出外键关系
427 -- -- powered by wanglifeng https://www.cnblogs.com/wanglifeng717
428 -- ----------------------------------------------------------------------
429 -- ----------------------------------------------------------------------
430 -- ----------------------------------------------------------------------
431 
432 
433 DROP TABLE IF    EXISTS test_temp;
434 CREATE TABLE test_temp AS 
435 SELECT @exec_sql:=REPLACE(@exec_sql,CONCAT_WS("","%",tbl_name,"_",col_name,"%"),query_ref_tbl_info) AS temp
436 FROM 
437 (        
438     SELECT 
439         CONCAT_WS("","(CONCAT_WS("",",""总行数:",",counts,","   \r\n",(","select  replace(group_concat(concat_ws("",",row_num_sum,",": {",",cols,","}")"," SEPARATOR "\r\n\r\n"),"$","\"") "," from  ",tbl_name,"  where ",col_name," = ",rf_name,".",rf_col," and @row_num_",tbl_name,"_",col_name," < ",@in_sub_limit," ) ",","\r\n\r\n",cols_desc,""))"
440         ) AS query_ref_tbl_info , t.* 
441     from        
442     (
443        SELECT
444           CONCAT_WS("","@row_num_",t.TABLE_NAME,"_",k.column_name,":=","@row_num_",t.TABLE_NAME,"_",k.column_name," + 1") AS row_num_sum,
445             t.TABLE_NAME AS tbl_name,
446             k.REFERENCED_TABLE_NAME AS rf_name,
447             k.column_name AS col_name,
448             k.REFERENCED_COLUMN_NAME AS rf_col 
449            ,CONCAT_WS("",TRIM(", "" from group_concat(CONCAT_WS("",""$",c.COLUMN_NAME,"$:$",","ifnull(",c.COLUMN_NAME,"," ")",","$, "") ORDER BY c.ORDINAL_POSITION )),""") AS cols
450             ,( CONCAT_WS("",""字段注释:"{
",
451                 GROUP_CONCAT(
452                     CONCAT_WS("",
453                        -- -----------------------------------------------------
454                         
455                       CONCAT_WS( "",""",c.COLUMN_NAME,""")
456                         
457                         ,repeat(" ",
458                         ((SELECT  MAX(length(CONCAT_WS( "",""",tt.COLUMN_NAME,""")))  FROM information_schema.COLUMNS tt  WHERE  tt.TABLE_SCHEMA =DATABASE() and tt.TABLE_NAME =c.TABLE_NAME)  
459                          - 
460                         LENGTH(CONCAT_WS( "",""",c.COLUMN_NAME,"""))
461                         )
462                         )
463                         
464                         ,CONCAT_WS(""," : "",c.COLUMN_COMMENT,""")
465                          -- -----------------------------------------------------
466                     )
467                   SEPARATOR ",
"),"
}") 
468             ) AS cols_desc    
469             ,
470             CONCAT_WS("","( select count(*) from ",t.TABLE_NAME," where ",k.column_name," = ",k.REFERENCED_TABLE_NAME,".",    k.REFERENCED_COLUMN_NAME," )") AS counts
471             ,
472             (
473                SELECT
474                     cc.COLUMN_NAME 
475                 FROM
476                     INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tt,
477                     INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS cc
478                 WHERE
479                     tt.TABLE_NAME = cc.TABLE_NAME
480                     AND tt.CONSTRAINT_NAME = cc.CONSTRAINT_NAME
481                     AND tt.TABLE_SCHEMA = DATABASE()
482                     AND cc.CONSTRAINT_SCHEMA=DATABASE()
483                     AND tt.CONSTRAINT_TYPE = "PRIMARY KEY"
484                     AND tt.TABLE_NAME=t.TABLE_NAME
485             ) AS tbl_name_pk
486             
487         FROM
488             information_schema.TABLE_CONSTRAINTS t
489             JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON t.CONSTRAINT_NAME = k.CONSTRAINT_NAME 
490             JOIN information_schema.COLUMNS c ON c.TABLE_NAME=k.TABLE_NAME
491             AND t.TABLE_NAME = k.TABLE_NAME 
492             AND c.table_schema=DATABASE()
493             AND t.CONSTRAINT_SCHEMA = k.CONSTRAINT_SCHEMA 
494         WHERE
495             t.CONSTRAINT_TYPE = "FOREIGN KEY" 
496             AND t.table_schema = DATABASE()
497             AND k.CONSTRAINT_SCHEMA=DATABASE() 
498             and k.REFERENCED_TABLE_NAME=@main_tbl
499             GROUP BY tbl_name,rf_name,col_name,rf_col
500     ) t
501 ) s;
502 
503 
504 
505 DROP TABLE IF EXISTS test_temp;
506         
507 SET @exec_sql=CONCAT_WS("",@exec_sql," ",@in_where," ) t ");
508 PREPARE stmt  FROM @exec_sql;
509 EXECUTE stmt;
510 DEALLOCATE PREPARE stmt;
511         
512     
513     DROP TABLE  IF    EXISTS test_main_tbl_col;
514     DROP TABLE    IF    EXISTS test_child_tbl;
515     DROP TABLE    IF EXISTS test_child_tbl_col;
516         
517         
518         
583 
584 END %%
585 
586 DELIMITER ;
587 
588 CALL tbl_query_help() ;
tbl_query存储过程

 

 

 

 

 

 

 

 

 

 

本文来自云海天,作者:wanglifeng,转载请注明原文链接:https://www.cnblogs.com/wanglifeng717/p/15838805.html

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

省去跨表联查与注释查询的存储过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

省去跨表联查与注释查询的存储过程

问题:  传统的select * from table 存在以下几个问题:        1.字段含义及“魔法数字”需要另开窗口对照查看,例如status有1,2,3,4,5        2.外键字段引用的是对方表的id,要知道id对应信息,需要另开窗口查询
省去跨表联查与注释查询的存储过程
2019-12-11

mysql与oracle通过存储过程查询数据库所有表的列总和

mysql数据库: delimiter // # 定义//为一句sql的结束标志,取消;的所代表的意义drop procedure if exists db_table_col_count; # 如果存在名字为db_table_col_count的proc
mysql与oracle通过存储过程查询数据库所有表的列总和
2020-01-06

oracle查询存储过程里面涉及的表有哪些

要查询存储过程涉及的表:连接到数据库。查询 all_object_tables 视图,过滤出存储过程涉及的表(object_name 与存储过程 object_name 匹配,排除临时表,表名不包含 $)。结果将包含存储过程名称 (obje
oracle查询存储过程里面涉及的表有哪些
2024-04-19

编程热搜

目录