SQL表连接视图where语句该如何实现?

两个表需要实现视图3的效果,利用现有语句会多余2条记录,where语句部分不知道该怎么实现?其中,表1、表2的ID不匹配(只是举例凑巧了),视图的路径想从表2得到。SELECT 表1.ID AS "编码",表1.Name AS "名称",表1.ParentID AS "上级",表2.路径 AS "路径"FROM "表1" left join "表2" on 表2.名称=表1.Name 。。。。。

你这个查询可以不用A表就直接出结果。

你把x当成你要查询的数据,然后去和父节y点关联,查询出父节点的id就是你要的上级ID。

关联的条是子表的父路径=父表的路径。

追问

表1、表2的ID不匹配(只是举例凑巧了),视图的路径想从表2得到。麻烦再看看。

追答

我想确认以下两个问题:

1. 你的表一中的第三行数据,id=3,name=b2,parentID=2,这一行数据对吗?它的parentID,不应该是1吗?

2. 你的表二中的第四列的值是父路径,根据这个值,应该可以得到每一行数据的父路径锁对应的父路径ID的值。得到的方式就是表二自己和自己left join左关联查询,得到的结果如下:

此时得到父路径ID也就是我截图中的parent_id,和表一中的parentID能对应上吗?


我总感觉你的这两个表设计的怪怪的,表一总觉得是多余的。表二完全可以满足你的需求。

是不是你举例的数据不太合适,你把你的表一和表二的第一列的值,重新写一下,写成不会人迷惑的字段,再贴上来看看。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-10-31
得到这个结果的原因是你的表内存在名称相同的两行,你在关联的时候只说了:表2.名称=表1.Name,那么在表1和表2中名称相同的两行就会分别对应两次,那么合起来也就是四次,也就是说多了两行。(也就是我们俗称的笛卡尔积)因为程序并不知道这个f应该对应另一张表的哪个f,所以他就都会对应。
解决的办法有两个:
(1)这个是比较正统的办法:再找一个对应关系
从现有的字段来看,在id字段不能用的情况下,那么ParentID是唯一的选择。那么我们就需要将表1改造一下,你应该知道表1的ParentID字段的对应关系,这个ParentID我不管是从什么地方来的(可能是表1的id,也可能不是,不过看起来应该是),但是一定可以找到对应关系,比如ParentID=5表示c2,ParentID=3表示b2(我没看id字段,我说的是ParentID的对应关系)
那么原来的表1就可以去改造了,新增一列(查询多一列,原表没有增加),这一列表示ParentID所以对应的name的值。这样id为8那一行对应的就是d,id为9那一行对应的就是e(我没有用id,只是这样说起来方便)。(你可能会问为什么要这样改造?因为表2中没有123456789,只有ab这种的,所以只能改造表1,改造成本也相对简单)
然后回到两张表连接的部分,左连接以后加一个where条件,那就是表2的父路径的最后一个/后面的部分与表1新出现的列相等,比如在表2中id=8那行(为了说起来方便),最后就是d与表1中id=8那行新增加的列的值是一样的,那么自然只会显示这一个,不会显示另外一个。同理另外一行也是一样的。这样也就解决了问题。
这种操作的难点在于如何定位最后一个/(你不能定位最后一个字符,现在是只有一个字符,如果最后一个/后面是C1那种,那么你的语句也就不能用了,所以只能定位为截取最后一个/后面的字符,oracle的相关函数我知道,不过看起来你的数据库不是oracle,那么可能函数要你自己找)

(2)邪路子
这个就比较简单了,因为不管那条数据结果肯定是对的,那么就直接在结果上distinct或者去重就行了,操作简单了很多,但是个人觉得这不是一种严谨的数据处理方式,所以并不是十分推荐使用。
相似回答