永发信息网

SQL Server,如何从三张互有关联的表中,有条件的找出有关联的行

答案:2  悬赏:80  手机版
解决时间 2021-03-31 07:10
  • 提问者网友:疯孩纸
  • 2021-03-30 12:21
SQL Server,如何从三张互有关联的表中,有条件的找出有关联的行
最佳答案
  • 五星知识达人网友:未来江山和你
  • 2021-03-30 12:54
看看这样行不行:
Select 丙.姓名,丙.消费金额,乙.任务类别,乙.任务阶段
,当前任务进度=Case When a.任务名称='exception_end' Or Not 丙.结束时间 Is Null
Then '终止' Else 乙.任务名称 End
From 丙
Left Join (Select * From 甲 Where 项目编码+任务变化编码 In
(Select 项目编码+Max(任务变化编码) From 甲
Group by 项目编码 ) ) a
On a.项目编码=丙.项目编码
Left Join 乙 On a.任务名称=乙.任务名称 And 丙.任务类别ID=乙.任务类别ID

不过这里有个问题,既然张三对应的甲表的任务名称是exception_end, 那么在乙表中应该找不到它的对应的任务阶段,为什么你<想要得到的表>中张三的任务阶段是<饮食>呢?追问感觉你写的是对的。任务阶段,我疏忽了,实际中的表结构有点复杂。
当任务名称是exception_end时,它对应的任务阶段ID(丙表中的字段)是-1.
真实的情况是
需要查询出,当前这个项目的任务进度,和它上一个任务进度以及下一个任务进度。
当任务终止时(还有正常结束,这里就不考虑了),任务进度显示任务终止,任务阶段显示任务结束。
所以,还需要向你请教一下:见补充的问题
本人实在是小白追答1.知道18,求 17 和19:
其实就是求小于18的最大数和大于18的最小数
求17: Select Max(id) From TableName Where id < 18
求19: Select Min(id) From TableName Where id > 18

2.可以这样试一下:
Select 需要的字段,....
From 公司人员任务状态表 AS 丙
Left Join 任务信息表 AS 乙 On 丙.任务类别ID=乙.任务类别ID
Left Join (生成甲的语句) AS 甲 On 甲.项目编码=丙.项目编码 and 甲.任务名称=乙.任务名称

如果甲表有重复的项就需要先对甲表进行处理追问这次执行没有报错,查询出来了张三和李四,但是
对应每个项目返回了所有的任务信息表的任务,并且没有换回exception_end追答对应exception_end的任务进度都显示为"终止"了
就是这句语句:
当前任务进度=Case When a.任务名称='exception_end' Or Not 丙.结束时间 Is Null
Then '终止' Else 乙.任务名称 End
或者可以改为
当前任务进度=Case When a.任务名称='exception_end' Then '终止'
When Not 丙.结束时间 Is Null Then '结束'
Else 乙.任务名称 End
这样当任务结束后就会出现两种不同的任务进度了追问那么对应每个项目匹配显示所有任务,怎么处理呢?
(450 行受影响)
只有30个项目,但是返回了450行追答返回了450行很可能是甲表中对应丙表的记录有重复项,所有调用甲表时要使用我第一次回答的那种调用方法,
而且我不太明白你到底要怎样的查询结果,好像跟你最初的提问不一样追问没有不一样。
就是图中的结果,后面的描述了更复杂的功能,但描述的不是问题。
我再描述一次
由甲乙丙三表关联生成我要的表,但是查不出终止的项目,只能查出正在进行和已经意外终止的项目。
因为甲表中有两行所对应的任务已经终止了,其中一个是正常终止的,在任务名称这一列,写入exception_end
写出我想要得到的表,就是满意答案。追答Select 丙.姓名,丙.消费金额,b.任务类别,Isnull(乙.任务阶段,'') 任务阶段
,当前任务进度=Case When a.任务名称='exception_end' Then '正常结束'
When Not 丙.结束时间 Is Null Then '意外终止'
Else 乙.任务名称 End
From 丙
Left Join (Select * From 甲 Where 项目编码+任务变化编码 In
(Select 项目编码+Max(任务变化编码) From 甲
Group by 项目编码 ) ) a
On a.项目编码=丙.项目编码
Left Join (Select 任务类别ID,Max(任务类别) 任务类别 From 乙 Group by 任务类别ID ) b
On 丙.任务类别ID=b.任务类别ID
Left Join 乙 On a.任务名称=乙.任务名称 And 丙.任务类别ID=乙.任务类别ID
或者你试一下上面的语句,当甲表为exception_end时,任务阶段就显示空白
全部回答
  • 1楼网友:夜风逐马
  • 2021-03-30 14:17
你用的是left join吧?如果是的话,把where 里面的条件放在on里面,where的作用是在你关联完毕后,筛选出符合条件的结果。所以会把不符合条件的除掉追问没有用
是这种的
select
要显示的字段
from
甲,乙,丙
where
甲.项目编码 = 丙.项目编码 and 甲.任务名称 = 乙.任务名称
and 丙.任务类别ID=乙.任务类别ID追答修改成这样
select
要显示的字段
from
甲 a
left join 乙 b on 甲.项目编码 = 丙.项目编码 and 甲.任务名称 = 乙.任务名称
left join 丙 c
on 丙.任务类别ID=乙.任务类别ID追问有个问题是其实甲表,是由另一张表结合乙、丙两表生成的。按你的做,老是出问题。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯