联表查询的问题

jomph 2012-05-03 04:53:30
假设一间工厂装配设备的数据库,数据表是两个,设计如下

表一:TB_Device (设备表)
字段:
DeviceID (设备编号)
DeviceName (设备名称)
WorkerID (工人编号)

表二:TB_Worker (工人表)
字段:
WorkerID (工人编号)
WorkerName (工人姓名)

现在如果要查询所有设备的并且显示谁负责装配可以这样写
SELECT
DeviceID
,DeviceName
,TB_Worker.WorkerName
FROM TB_Device LEFT JOIN TB_Worker
ON TB_Device.WorkerID=TB_Worker.WorkerID
ORDER BY DeviceID ASC


但如果设备的装配是分2步的,分别由不同的工人装配,在设备表加多一个WorkerID2的字段,即

DeviceID (设备编号)
DeviceName (设备名称)
WorkerID (工人编号)
WorkerID2 (工人编号)

这时用join的方式怎么实现??

本人初学,只想到用嵌套select字句的方式:

SELECT
DeviceID
,DeviceName
,(SELECT WorkerName FROM TB_Worker WHERE TB_Worker.WorkerID=TB_Device.WorkerID)
,(SELECT WorkerName FROM TB_Worker WHERE TB_Worker.WorkerID=TB_Device.WorkerID2)
FROM TB_Device
ORDER BY DeviceID ASC


但如果装配要分十几步或更多的时候,嵌套的select语句就要写很多个了,所以觉得这种方式不太可行

新手求解惑!!
...全文
66 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jomph 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
你这个问题不要放到数据库里来实现,太繁琐了,而且在数据库里只能做成固定的装配步骤。
放到前台代码里实现,方便又灵活。WorkerID 改成Varchar,存工人ID用“,”隔开,在代码层写一个方法,根据工人ID字符串生成工人名字的字符串,就可以了。
[/Quote]其实这个只是个举例,我在另外一个项目遇到的问题,就是一个表(A)内有两个字段是外键,都关联到另一个表(B),而且都关联到B中的同一个字段,就产生了使用join时不知如何分别连接两个字段的问题。

即使是上面提到的例子,我也是假定有固定装配步骤的情况,如果不是固定步骤,我觉得再新建一个表记录装配步骤,以设备编号关联,这种方法更好
voodooer 2012-05-03
  • 打赏
  • 举报
回复
补充一下,如果非要在数据库里实现也可以,就是自己写个自定义函数,根据工人ID字符串生成工人名字的字符串,就可以了。
voodooer 2012-05-03
  • 打赏
  • 举报
回复
你这个问题不要放到数据库里来实现,太繁琐了,而且在数据库里只能做成固定的装配步骤。
放到前台代码里实现,方便又灵活。WorkerID 改成Varchar,存工人ID用“,”隔开,在代码层写一个方法,根据工人ID字符串生成工人名字的字符串,就可以了。
nightgoblin 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:

SQL code

select DeviceID,DeviceName,WorkerName,WorkerName2 from(
select DeviceID,DeviceName,WorkerName,WorkerID2 from TB_Device a
left join TB_Worker b on a.WorkerID=b.WorkerID)t
……
[/Quote]
是的,就是这个意思,请问下楼主这个两个表是住外键的关系么?
其实,没有别要用左外连接的,直接用内连接也可以

SELECT
t1.DeviceID
,t1.DeviceName
,t2.WorkerName
,t3.WorkerName
FROM TB_Device AS t1
INNER JOIN TB_Worker as t2 ON t1.WorkerID=t2.WorkerID
INNER JOIN TB_Worker as t3
ON t1.WorkerID=t3.WorkerID
ORDER BY t1.DeviceID ASC
jomph 2012-05-03
  • 打赏
  • 举报
回复
其实刚才是引用错了,不过谢两位了,结贴
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 1 楼 的回复:

SQL code

select DeviceID,DeviceName,WorkerName,WorkerName2 from(
select DeviceID,DeviceName,WorkerName,WorkerID2 from TB_Device a
left join TB_Worker b on a.WorkerID=b.WorkerID……
[/Quote]

是的,但是你的给表取别名区分开来
jomph 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

SQL code

select DeviceID,DeviceName,WorkerName,WorkerName2 from(
select DeviceID,DeviceName,WorkerName,WorkerID2 from TB_Device a
left join TB_Worker b on a.WorkerID=b.WorkerID)t
left join TB_Wo……
[/Quote]请问高人是不是这么个意思?
SELECT
DeviceID
,DeviceName
,tbwk1.WorkerName
,tbwk2.WorkerName
FROM TB_Device
LEFT JOIN TB_Worker as tbwk1
ON TB_Device.WorkerID=tbwk1.WorkerID
LEFT JOIN TB_Worker as tbwk2
ON TB_Device.WorkerID=tbwk2.WorkerID
ORDER BY DeviceID ASC
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

TB_Worker 这个可以取N个别名的


意思就是TB A join TB_Worker B ON A.XX=B.XX JOIN TB_Worker C ON A.XX=C.XX


这样。
[/Quote]

对,没反应过来,糊涂了,F老板厉害哦
--小F-- 2012-05-03
  • 打赏
  • 举报
回复
TB_Worker 这个可以取N个别名的


意思就是TB A join TB_Worker B ON A.XX=B.XX JOIN TB_Worker C ON A.XX=C.XX


这样。
  • 打赏
  • 举报
回复

select DeviceID,DeviceName,WorkerName,WorkerName2 from(
select DeviceID,DeviceName,WorkerName,WorkerID2 from TB_Device a
left join TB_Worker b on a.WorkerID=b.WorkerID)t
left join TB_Worker s on t.WorkerID2=s.WorkerID

34,593

社区成员

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

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