这个SQL语句如何写?或者怎样修改表结构?

oldsky 2003-04-23 10:55:48
表A:NodeID (int,主键),NodeName (nvarchar),...
表B:TestID (int,主键),TestName (nvarchar),...
表C:QuesID (int,主键),QuesName (nvarchar),...
表D:NodeID ,TestID, ReType (char),...
现在要根据表D查出NodeName或TestName或QuesName,最后结果为:
ID Name (别名)
2 fff
1 ddd
...

(ReType为D时,需要查表A得到NodeName;ReType为T时,需要查表B得到TestName;ReType为Q时,需要查表C得到QuesName)

...全文
102 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oldsky 2003-04-30
  • 打赏
  • 举报
回复
pengdali(大力):你的报错:当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
谢谢 tj_dns(愉快的登山者) 、 newdongkui(老乌鸦)、Rewiah(乘长风) ( )
yiyanFengZi 2003-04-25
  • 打赏
  • 举报
回复
declare @2 table (y int,b char(10))
insert @2 values (1,'a')
insert @2 values (2,'d')
insert @2 values (3,'c')
insert @2 values (4,'d')

declare @b table(a int,b char(1))
insert @b values(1,'1')
insert @b values(3,'3')

declare @a table(a int,b int,type Char(1))
insert @a values(4,1,'A')
insert @a values(2,3,'B')


Select * From @a
Select * From @b
Select * From @2
Select (case d.type When 'A' Then d.a
When 'B' Then d.b end) as ID,(case d.type When 'A' Then (select b From @2 A Where A.y=d.a)
When 'B' Then (Select b From @b B where b.a=d.b) end) as name from @a d
oldsky 2003-04-25
  • 打赏
  • 举报
回复
多谢各位
pengdali 2003-04-23
  • 打赏
  • 举报
回复
我不是写对了吗?

select case reType
when 'D' then (select NodeName from A where NodeID=D.TestID)
when 'T' then (select TestName from B where TestID=D.TestID)
when 'Q' then (select QuesName from C where QuesID=D.TestID)
end
from D
oldsky 2003-04-23
  • 打赏
  • 举报
回复
问题原意如下:
表D是一个回收站表,表A-表C是三个不同类型的文件表,由于各种类型文件的属性和字段不同,就用了3个表,但基本的文件ID和文件名这2个字段都有。当我进入回收站时,看到的只是那些文件名就可以了。现在我要用语句查出这些文件名就可以了。
愉快的登山者 2003-04-23
  • 打赏
  • 举报
回复
表D:NodeID ,TestID, ReType (char),...
可以修改成:
1。表D:ID ,ReType (char),...
2。表D:NodeID ,TestID, Quesid, ReType (char),...
我认为1比较好。
针对修改后的表D,建立查询语句:
select D.id, (case D.retype when 'A' then A.nodename
when 'T' then B.testname
when 'Q' then C.quesname
end ) as Name from D
left join A on A.NodeID = D.id
left join B on B.NodeID = D.id
left join C on C.NodeID = D.id
灯火GG 2003-04-23
  • 打赏
  • 举报
回复
select case reType
when 'D' then (select NodeName from A where NodeID=D.TestID)
when 'T' then (select TestName from B where TestID=D.TestID)
when 'Q' then (select QuesName from C where QuesID=D.TestID)
end
from D
Rewiah 2003-04-23
  • 打赏
  • 举报
回复
楼主问题是不是写错了,表d的结构应该是ID,ReType (char),...
或者NodeID ,TestID,QuesID, ReType (char),...


如果表结构是NodeID ,TestID,QuesID, ReType (char),...

CASE 写法:
select D.ID,(case D.retype when 'D' then d.NodeID when 'T' then d.testid when 'Q' then d.QuesID end) as id , (case retype when 'D' then a.nodename when 'T' then b.testname when 'Q' then c.quesname end) as name
from d
LEFT join a on a.id = d.nodeid
LEFT join b on b.id = d.testid
LEFT join c on c.id = d.quesid

推荐UNION ALL写法:
SELECT D.testid AS ID,A.NODENAME AS NAME
FROM D,A
WHERE D.retype ='D'
AND D.NodeID=A.NodeID
UNION ALL
SELECT D.testid AS ID,B.TESTNAME AS NAME
FROM D,B
WHERE D.retype ='T'
AND D.testid =B.testid
UNION ALL
SELECT D.QuesID AS ID,C.QuesNAME AS NAME
FROM D,C
WHERE D.retype ='Q'
AND D.QuesID =C.QuesID

pengdali 2003-04-23
  • 打赏
  • 举报
回复
或:

select case reType when 'D' then a.NodeName when 'T' then b.TestName when 'Q' then q.QuesName end
from D left join a on a.NodeID=D.TestID
left join B on b.TestID=D.TestID
left join C on c.QuesID=D.TestID
pengdali 2003-04-23
  • 打赏
  • 举报
回复

select case reType
when 'D' then (select NodeName from A where NodeID=D.TestID)
when 'T' then (select TestName from B where TestID=D.TestID)
when 'Q' then (select QuesName from C where QuesID=D.TestID)
end
from D
newdongkui 2003-04-23
  • 打赏
  • 举报
回复
用union或者用case,这里我说case的写法

select (case retype when 'A' then d.NodeID when 'T' then d.testid when 'Q' then d.QuesID end) as id , (case retype when 'A' then a.nodename when 'T' then b.testname when 'Q' then c.quesname end) as name
from d
inner join a on a.nodeid = d.nodeid
inner join b on b.testid = d.testid
inner join c on c.quesid = d.quesid
内容概要:本文详细介绍了一个基于Java和Vue的深度学习口罩佩戴识别与人数统计系统的设计与实现。系统采用YOLOv5等深度学习目标检测模型,结合人脸检测与多目标追踪算法(如DeepSort),实现对人员是否佩戴口罩的精准识别及实时人数统计。项目涵盖从数据采集、标注、增强、模型训练到推理部署的全流程,并通过Spring Boot构建Java后端服务进行模型调度与业务处理,前端使用Vue+Element UI实现数据可视化与用户交互,支持告警推送、统计图展示和历史溯源。系统具备高鲁棒性、实时性与跨平台兼容性,适用于多种公共场景的智能防疫管理。; 适合人群:具备一定Java、Vue开发基础,熟悉深度学习基本概念的中初级程序员、AI应用开发者及计算机相关专业学生;适合从事智慧安防、智能监控系统研发的技术人员。; 使用场景及目标:①用于医院、校园、商超、地铁等公共场所的自动化口罩佩戴监测与人流统计;②提升疫情防控效率,降低人工巡检成本;③为智慧城市建设提供可扩展的AI视觉解决方案;④学习AI模型与前后端系统集成的完整实践案例。; 阅读建议:此资源包含模型设计、代码示例与系统架构说明,建议结合代码实践,重点关注数据处理、模型推理集成与前后端通信机制,适合边调试边理解整体流程,进而掌握智能监控系统的开发模式。

34,873

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧