请问这个SQL如何写?

slowgrace 2009-03-31 09:14:20
我用的是ACCESS,对应的可能是JET SQL

我有个表tblNode,有4个字段:lngNodeId(主键),lngFatherId, strDetailTable, lngDetailId

另外有若干表结构完全相同的细节表,表名分别是action, project, logItem等。字段有lngId(主键),strName

tblNode记录和细节表有一定的对应关系:tblNode表的strDetailTable字段存的是细节表名,即"action", "project", "logItem"等,指明当前记录是哪种细节; tblNode表的lngDetailId字段指明当前记录的细节ID,对应于细节表里的lngId字段。

现在我要做一个查询,结果集返回3个字段:lngNodeId,lngFatherId,strName。其中前2个字段来自tblNode,而strName来自相应的细节表的相应记录的strName字段,大致是下面这个意思:
select strName from tblNode.strDetailTable where lngId = tblNode.lngDetailid


请问这个查询该如何写
...全文
137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Tiger_Zhao 的回复:]
你将它们分组总是有原因的,如果根本没有需要区分更加应该合并了。
[/Quote]

恩,你真聪明。我也才想起,它们还有各自独特的属性,呵呵。
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Tiger_Zhao 的回复:]
SQL codeSELECT N.lngNodeID, D.strName
FROM tblNode N
JOIN ( SELECT lngID, strName, 'action' AS DetailType FROM action
UNION ALL
SELECT lngID, strName, 'project' AS DetailType FROM project
UNION ALL
SELECT lngID, strName, 'logItem' AS DetailType FROM logItem
) D
ON D.lngID = N.lngDetailID
AND D.DetailType = N.strDetailTable
[/Quote]

谢谢,这个SQL基本上解决问题了。只除了join 要改成inner join。access里不认识单独的join,只能是inner join或者left join或者right join
Tiger_Zhao 2009-03-31
  • 打赏
  • 举报
回复
你将它们分组总是有原因的,如果根本没有需要区分更加应该合并了。
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
我是说 D表里的DetailType 字段。
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Tiger_Zhao 的回复:]
数据库设计不合理,应该将 action、project、logItem 等合并成一个表(类似上面查询中的 D)[/Quote]

如果合成一个表,那type字段不是很冗余么
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
谢谢jhone

貌似不行。ACCESS把这里的strName理解为参数,要求输入参数值。
Tiger_Zhao 2009-03-31
  • 打赏
  • 举报
回复
SELECT N.lngNodeID, D.strName
FROM tblNode N
JOIN ( SELECT lngID, strName, 'action' AS DetailType FROM action
UNION ALL
SELECT lngID, strName, 'project' AS DetailType FROM project
UNION ALL
SELECT lngID, strName, 'logItem' AS DetailType FROM logItem
) D
ON D.lngID = N.lngDetailID
AND D.DetailType = N.strDetailTable

数据库设计不合理,应该将 action、project、logItem 等合并成一个表(类似上面查询中的 D)
jhone99 2009-03-31
  • 打赏
  • 举报
回复
没有测试,呵呵
select strName 
from (select strDetailTable from tblNode)
where lngId = (select lngDetailid from tblNode)
slowgrace 2009-03-31
  • 打赏
  • 举报
回复
谢谢天乐。
天乐_那由他 2009-03-31
  • 打赏
  • 举报
回复
没用过ACCESS,主要来帮顶吧。

似乎不是一句SQL能够解决的。

按我的理解,这里需要把字符串转为表名使用,在SQL Server或Oracle中都需要exec,

而access是否支持存储过程我不知道。

等高手来。



1,217

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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