MySQL 如何仅用一条SQL语句或存储过程或自定义函数 判断两条记录之间是否存在层级关联 10C

图片说明

表格不止四个,还可能有表E、F、G。

数据库表之间的关系如图,子表的每条记录通过'parent_id'和'parent_table'两个属性指向父表的一条记录。所有表均包含这两个属性(A表中该值为空)。

如何只用一条SQL语句(或者写一个存储过程、自定义函数)用以判断任意两条记录之间知否有层级间的从属关系?

我尝试用动态执行SQL语句和递归去实现,但是由于技艺不精都失败了。请问各位大大这可如何是好啊~

0

3个回答

有点像无限极分类, 不知道具体几层, 用递归弄

0
lgj123xj
猿长大人 回复qq_39522549: 嗯嗯,已经解决啦,多谢你的提醒~
5 个月之前 回复
qq_39522549
qq_39522549 回复猿长大人: mysql函数不能用递归,存储过程可以,但是默认禁用了。需要SET @@SESSION.max_sp_recursion_depth=25。
5 个月之前 回复
lgj123xj
猿长大人 是想用递归的,但是只能使用SQL全部在数据库内实现。动态执行SQL语句又取不出数据,所以卡住了~
5 个月之前 回复

通过函数的方式判断两条记录是否存在层级关联

CREATE FUNCTION is_relation(类型 parent_id1,类型 parent_table1,类型 parent_id2,类型 parent_table2)
BEGIN
#判断纪录1是否与纪录2相关联
SELECT parent_id,parent_table INTO @pi,@pt FROM parent_table1 WHERE parent_id=parent_id1;
WHILE @pi IS NOT NULL
DO
IF @pi=parent_id2 THEN
RETURN 1;
END IF;
SELECT parent_id,parent_table INTO @pi,@pt FROM parent_table1 WHERE parent_id=@pi;
END WHILE;

#判断纪录2是否与纪录1相关联
...
类似于1
...

RETURN 0;
END

代码未补全只理了个思路,应该是可以实现的

0
lgj123xj
猿长大人 感谢您的回答,两条数据之间相隔的表格的级数并不能确定,可能存在关联也可能不存在。这个问题我昨天已经解决了,使用了动态执行SQL+递归存储过程。原本想发出来分享实现的具体代码,但是开发中由于其中还杂糅了其他的一些功能配合使用,不是很好分离这部分的代码,所以没有暂时没有发出来分享。还是感谢你的帮助~
5 个月之前 回复

看我理解的对不对。

不同的级别存在不同的表里边,指定表中某一个字段存有下一级级别的数据。

例如:
你画的图有4个级别,分别对应4个表。
级别1对应表1,某个字段存有级别2的数据;
级别2对应表2,某个字段存有级别3的数据;
级别3对应表3,某个字段存有级别4的数据;
级别4对应表4。。。。

假如有新的级别,就对应出现新的表,而且表名、存储字段的级别都有顺序。

你都说了不知道属于哪个级别,还要查询2条数据是否有对应关系。
可以先用循环先遍历一遍所有级别的表,查询一条数据是在哪个具体的表里边,然后再去上下2个级别的表去查询另一条数据是否存在就好了。

0
lgj123xj
猿长大人 感谢您的回答,两条数据之间相隔的表格的级数并不能确定,可能存在关联也可能不存在。这个问题我昨天已经解决了,使用了动态执行SQL+递归存储过程。原本想发出来分享实现的具体代码,但是开发中由于其中还杂糅了其他的一些功能配合使用,不是很好分离这部分的代码,所以没有暂时没有发出来分享。还是感谢你的帮助~
5 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
sqlserver 各种判断是否存在(表、视图、函数、存储过程等)
1、判断表是否存在 select * from sysobjects where id = object_id(表名) and OBJECTPROPERTY(id, N'IsUserTable') = 1 2、判断视图是否存在 select table_name from information_schema.views where table_name = 视图名 或者 SELE...
SQL自定义函数,验证两条数据的相似度
CREATE FUNCTION F_strcompare(@str1 VARCHAR(8000),                              @str2 VARCHAR(8000)) RETURNS VARCHAR(10) AS   BEGIN       DECLARE @i   INT,               @j   INT,              
mysql数据表中,如何判断某一条记录是否重复
#检测foodname是否重复 select foodname,count(*) as count from tablename group by foodname having count>1;
sql语句insert之前判断是否已存在记录
INSERT INTO test(A,B) select 'ab',2   WHERE NOT EXISTS (SELECT * FROM test WHERE A='ab');
sql查询是否存在某个记录(是否存在某一行)
学习自https://www.cnblogs.com/xunziji/p/6343891.html今天查了下,发现网上的没有一个sql语句写的好的。判断记录是否存在,要不是语句不够简洁,要不就是性能有很大问题。 我进行了优化后,最简洁简单性能最优的的sql语句,用来判断表中的记录是否存在:select isnull((select top(1) 1 from tableName where con...
mysql查询(同一个表中相邻的两条记录进行运算)
应用:同一个表中相邻的两条记录进行运算中的cpu_busy,cpu_total。   cpu_total=usr+nice+sys+idle+iowait+irq+softirq;   cpu_busy=cpu_total-idle;   计算cpu利用率:   cpu_usage=(cpu_busy2-cpu_busy1)/(cpu_total2 -cpu_tot
Mysql判断记录是否存在
最近在开发一个电商平台的时候,经常会遇到要判断表中是否存在某条记录,不存在,则插入。 判断记录是否存在的sql,不同的写法,也会有不同的性能。 select count(*) from tablename where col = 'col'; 这种方法性能上有些浪费,没必要把全部记录查出来。 select 1 from tablename where col = '
mysql中判断记录是否存在方法比较
sql语句:select 1 from tablename where col = col limit 1;  当然这里limit 1很重要。这要mysql找到一条记录后就不会在往下找了。这里执行所影响的行数不是0就是1,性能提高了不少。  这里还有人可能会去读取sql语句查询到的记录,然后判断记录是否存在,从而判断记录是否存在。这个方法虽然可行,但对于我们的要求来说,还是有些浪费
如何判断一条sql(update,delete)语句是否执行成功
如何判断一条sql(update,delete)语句是否执行成功   catch  (SQLException    e)  {  }  catch不到错误应该就成功了。   =====================================================================  Statement对象提供了三种执行sql语句的方法。  1.ResultSe
查找存储过程,判断mysql是否存在此列
DROP PROCEDURE IF EXISTS p7;    --防止数据库中有这个存储过程,先删掉      CREATE PROCEDURE p7()   BEGIN          DECLARE nRetRowCount int;          SELECT count(COLUMN_NAME) INTO nRetRowCount       FROM inform
mysql更新判断存在更新,不存在插入
MySql更新多条数据不建议使用UPDATE语句  转载地址:http://ju.outofmemory.cn/entry/18814 mysql 更新插入,可以执行类似oracle 的  merge 语句来做判断是更新还是插入 这就要介绍一下在MySql中INSERT语法具有一个条件DUPLICATE KEY UPDATE,这个语法和适合用在需要判断记录是否存在,不存在则插入存
mysql 计算相邻两条记录的时间差
比如排序之后我们想计算两条相邻记录的时间差,因为mysql没有窗口函数所以要么模拟窗口函数要么使用表自关联,现有如下表数据: 单独只有这些信息使用自关联没有约束条件,这时候我们可以使用增加一个序号的字段,然后使用序号条件关联 表一:select a.*,(@i := @i + 1) as ord_num from t_punch_cade a,(select @i := 1) d order
sql语句实现多条数据合为一条数据
今天遇到个函数感觉很有用,给你们举个例子吧: 当我们给用户多个角色的时候,我们的用户角色表的展示方式有两种, 一种是把所有角色何在一起变成一个字符串,然后在该表查看用户就能看到一条关于用户角色的数据 另一种就是插入多条数据,一个用户一个角色,然后再对同一个用户insert一个角色,也就是当查询一个用户的时候,返回的是多条数据 个人感觉返回多条的数据这种方式便于数据库管理,但是如果在前台展示
两条记录合并一条的 sql
select          eu.ID, eu.UID, eu.ID_NO, eu.USER_NICK, eu.USER_NAME, eu.PWD_DIGEST, eu.PWD_SALT, eu.SEX,EMAIL, eu.PHONE, eu.STATUS, eu.USER_TYPE, eu.REG_SRC_ID, eu.USER_LOC, eu.GMT_BIRTH,
SQL查询多条只取其中最新的一条数据
首先  查询表fp_studentItem中的studentid=1;有5条数据,我只想要id=163的最新数据 两种方法: 1、SELECT * FROM fp_studentItem where id=( SELECT MAX(id) FROM fp_studentItem where studentid=1)  子查询查询最大的id(不怎么推荐) 2、SELECT * FROM ...
查询数据表中某字段值是否有多条记录相同的sql语句
在实际应用中,数据库中表的记录可能非常多,经常会想知道是否有多条记录的某个字段值是一样的,sql语句如下:select * from tms_mer where merid in(select merid from tms_mer group by merid having count(*)>1); 或者: select merid,count(1) from tms_mer m group
mysql查询是否存在某条记录,不存在则插入,存在则更新
在工作中,会遇到这样的情形,查询数据库中是否存在一条记录信息,如果不存在则插入一条新的信息,如果存在,则更新已有的信息。 面对这样的需求,之前采用的是先读取一遍数据库,判断是否有数据,如果没有则插入一条新信息,如果有,则更新已有信息,但是这种做法在高并发情况下可能存在多个线程查询时都没有数据,于是都往数据库中插入新的记录,在插入时则会抛出异常(说该信息已在数据库中)。 后来发现
Java大牛养成记——一条SQL语句更新同一张表中的两条数据
背景:项目中的需求是这样的:一堆图片中只有一张图片的状态是“启用”的,其他图片的状态是“未启用”。点击某张图片下面的启用按钮,这张图片的状态为“启用”,同时其他图片的状态修改为“未启用”。想象一下这个过程是很简单的,但是理想是丰满的,现实是骨感的,下面介绍一下详细的过程。 一、问题           背景中说过了,现在就不多赘述了。 二、解决方案1 1、SQL语
SQL语句判断表 数据库 数据是否存在
 Sql Server中判断表或者数据库是否存在  if exists(select 1 from master..dbo.sysdatabases where name=example)print DataBase existedelseprint Database not existed2.表IF Exists(Select 1 From sysObjects Wh
Oracle实现数据不存在则插入,数据存在则更新(insert or update)
思路是写一个函数,先按条件查询数据,如果查询到数据则更新,如果没有查询到数据则插入: create or replace function fn_merge_index(statdate in date, cpid in varchar2,
sql查找两条以上的数据 having
主要是查询数据库中两条或者多条相同ID对应不同的人,或者说多个人对应一个ID,要的做的是查询哪些ID是对应2个人以上的。  select *   from formlsbenefi  where prtnum in (select prtnum                     from formlsbenefi t                    group by
如何检查某条记录是否存在在表中
需求:检查某条记录是否存在在表中看了很多人都是count,提供一个别的思路SELECT 1 FROM table_name where rownum = 1 and column = ? 取出第一条数据记得column加索引
一条update语句更新多条sql记录
要求:将dispatch表中关联的用户名更新到dispatch表中。 UPDATE xn_m_dispatch disp LEFT JOIN (SELECT dis.`id` AS dispatchID,u.`name` AS userName FROM xn_m_dispatch dis LEFT JOIN xn_m_logistics_order lo ON lo.`id`=dis.`log...
mysql数据库中关于记录存在,更新记录,记录不存在,插入记录的sql语句编写
在日常开发中,我们经常会遇到这样的需求,如果这条记录存在,那么请更新记录,如果不存在,插入记录,通常的做法是,插入之前做一次select,如果记录不存在就执行insert,如果记录存在,就执行update,这样做有如下缺点: 1.如果你的表换没有创建索引,就会在select时进行全表扫描,如果表中数据量较大,这样就执行一次select就会耗费大量的系统资源,会导致系统性能极差。 2.多次操作数据库,
SQL语句-根据条件判断是否执行下一段Sql语句(联合查询)
有时候我们会遇到这样一个场景:根据其中一个表字段值,判断是否执行其他查询语句。 也就是说,看第一个表中某字段的“眼色”,由其决定是否进行查询。其实很简单,但容易进入理解误区导致较真儿。 第一步:先实现一个表条件查询 select a from table1 第二步:根据条件一,执行后续语句 select t1.a,t1.b,t1.c from table1 t1 union all ...
MYSQL查询一个表中是否存在重复的内容
SELECT * FROM table a WHERE ((SELECT COUNT(*) FROM table WHERE openid = a.openid) > 1) ORDER BY openid DESC
一条sql语句判断数据是否存在
string sql = @"IF EXISTS (SELECT * FROM [表] WHERE [name]=tom)UPDATE [表] SET [age]=20 WHERE [name]=tomELSE BEGININSERT INTO [表] ([name],[age],[sex]) VALUES (tom,20,male)END"; 
MySQL插入数据时,如果记录不存在则insert,如果存在则update
MySQL 当记录不存在时insert,当记录存在时更新 网上基本有三种解决方法。 第一种: 示例一:insert多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id, client_name, client_type) SELECT supplier_i
Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录。这样的逻辑固然可以通过两条sql语句完成。SELECT COUNT(*) FROM xxx WHERE ID=xxx;if (x == 0) INSERT INTO xxx VALUES; else UPDATE xxx SET ;但是
C# 检测数据库中一条记录是否存在方法
在C#中检测数据库中一条记录是否存在可以使用SQL语句的COUNT或EXISTS,如: SELECT * from users where user_name like 'Adam' AND password like '123456' C#操作代码: int userCount = (int) sqlCommand.ExecuteScalar(); if(userCount > ...
MySQL存储过程----创建索引前,先判断索引是否已经存在,如果存在,则不添加,如果不存在,添加
USE xxx_db; /* 一、 * 安全创建索引的存储过程: * 首先判断索引是否存在,如果已经存在则不创建,如果不存在,则创建。 * 防止索引已经存在,创建出错和删除索引重复创建原来的索引带来的开销浪费 * * 参数说明: * p_dbname : 数据库名称 * p_tablename : 表名称 * p_idxname : 索引名称 * p_index : 索引名称
sql去重;同一条数据出现多条取一条的sql语句
理论上相同数据个别字段值不同重复问题: 1.某字段重复,其他字段值不同时,按重复字段分组只取一条的sql语句 (eg:相同的数据某个字段值有差别导致存储两条或多条无意义重复数据的情况)select s.* from (    select a.*, row_number() over (partition by [重复字段] order   by [不同字段]) as group_idx f...
mysql插入前判断数据是否存在
业务场景:需要记入访客的访问情况,但不能重复记入可以插入前进行判断要插入的数据是否存在业务代码如下 :INSERT INTO t_topic_vistor(user_id,topic_code) SELECT '218', 'XQ33019920170811142528217' FROM DUAL WHERE NOT EXISTS(SELECT * FROM t_topic_vistor WHERE
MySQL 多表关联一对多查询取最新的一条数据
MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 由于历史原因,表结构设计不合理;产品告诉我说需要导出客户信息数据,需要导出客户的 所属行业,纳税性质 数据;但是这两个字段却在订单表里面,每次客户下单都会要求客户填写;由此可知,客户数据和订单数据是一对多的关系;那这样的话,问题就来了,我到底以订单中的哪一条数据为准呢?经过协商后一致同意...
sqlserver 各种判断是否存在(表名、函数、存储过程.......)
库是否存在 if exists(select *from master..sysdatabaseswhere name=N'库名') print'exists' else print'not exists' --------------- -- 判断要创建的表名是否存在 if exists (select *from dbo.sysobjectswhere id = object_id(N'[db
sql语句 判断表数据是否存在另一个表中
a表的id和b表的id相关联,只需判断一下即可。select *, case when (select count(*) from b where id = a.id)>0 then 1 else 0 end as flag from a如果你是想a表和b表的字段和id这两列都一样,才将flag显示为1的话,用下面的查询:select *, case when (select count(*) fr
mysql中的判断是否有该条数据 如果有返回1 没有返回0
SELECT IF(pic IS NOT NULL,1,0) AS a FROM items pic 是items表中的字段 a 是起的别名 items 是表名
sql语句 一个表 用户产生两条不同类型的数据 拼接成一条数据
SELECT * FROM exp1_profit_alloc_c03 AS c03_0 INNER JOIN exp1_profit_alloc_c03 AS c03_1 ON c03_0.uid = c03_1.uid AND c03_0.settleDate = c03_1.settleDate AND c03_1.src = 1 WHERE c03_0.src = 0
MySQL 一条语句实现若记录存在则更新,不存在则插入
MySQL 一条语句实现若记录存在则更新,不存在则插入 问题产生 博主相信很多人在开发的时候难免会出现需要先判断某个记录是否存在,存在则更新,不存在则插入新记录的情况(如在填写报名表的时候有用户需要修改信息等)。通常的做法是先使用 DELETE 语句先删除一下再使用 INSERT INTO 语句插入,这样做显然效率会比较低。 解决办法 MySQL 为我们提供了一个新的途径可以方便地实现仅执...
一个sql的优化:判断表行数大于0行
判断表行数大于0行的逻辑改写   判断表行数大于0行的逻辑改写 内容来自梁敬彬的基于案例学SQL优化,正文如下: 需求看透,什么才是真正的需求。 begin select count(*) into v_cnt from t1 ; if v_cnt>0 then  …A逻辑…. else then  …B逻辑….. End;   我来翻译
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习的博客或网站 java学习课件或笔记