+100分,求SQL语句

sunkangta1 2005-09-07 11:07:13
我用的是Access
数据库Procs:
id Pname TypeA TypeB

数据库TypeA:
id Tname

数据库TypeB;
id Tname

这样三个表,由于在Procs表中的TypeA,TypeB字端代表相应表中的内容,我想在Select Procs表中内容时,TypeA,TypeB字缎显示相应TypeA,TypeB表中的名称,请问SQL语句怎么写?


string sqlShow = "
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs, TypeA, TypeB
WHERE Procs.TypeA = TypeA.ID AND Procs.TypeB = TypeB.ID

这种方法就不要了,因为发现无古多出几条记录


解决的:http://community.csdn.net/Expert/topic/4255/4255820.xml?temp=6.223696E-02
这里40分也送你了
...全文
137 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
singlepine 2005-09-08
  • 打赏
  • 举报
回复
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs
left join TypeA on TypeA.id=Procs.id
left join TypeB on TypeB.id=Procs.id
sunkangta1 2005-09-08
  • 打赏
  • 举报
回复
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs
LEFT JOIN TypeA ON Procs.TypeA = TypeA.ID
LEFT JOIN TypeB ON Procs.TypeB = TypeB.ID

天哪,这样的语句我只能用一个Left Join,用两个或以上就出现这错误,怎么回事啊?
sunkangta1 2005-09-08
  • 打赏
  • 举报
回复
cdo(VC?我才刚学) :
语法错误 (操作符丢失) 在查询表达式 'Procs.TypeA = TypeA.ID LEFT JOIN TypeB ON Procs.TypeB = TypeB.ID' 中。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Data.OleDb.OleDbException: 语法错误 (操作符丢失) 在查询表达式 'Procs.TypeA = TypeA.ID LEFT JOIN TypeB ON Procs.TypeB = TypeB.ID' 中。
饮水需思源 2005-09-08
  • 打赏
  • 举报
回复
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs LEFT JOIN TypeA ON Procs.TypeA = TypeA.ID LEFT JOIN TypeB ON Procs.TypeB = TypeB.ID
伴老思源 2005-09-08
  • 打赏
  • 举报
回复
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs Procs
inner JOIN TypeA TypeA
ON Procs.TypeA = TypeA.ID
inner JOIN TypeB TypeB
ON Procs.TypeB = TypeB.ID
LMTZ 2005-09-08
  • 打赏
  • 举报
回复
同意 wuyi8808(tm) studio 2005  的观点!
如果在Procs表中没有重复纪录的话,
搂主原来的“WHERE Procs.TypeA = TypeA.ID AND Procs.TypeB = TypeB.ID”方法
并不会出现重复纪录。

用外连接的方法能够查询出Procs表中存在,但在TypeA或者TypeB表中不存在的纪录,
不知道搂主到底什么样的需求呢?
wuyi8808 2005-09-08
  • 打赏
  • 举报
回复
经测试, 下面这个查询语句在 Access 中可以正常工作:

SELECT P.ID, P.Pname AS 名称, A.Tname AS 大类, B.Tname AS 小类
FROM TypeB B
RIGHT JOIN (TypeA A RIGHT JOIN Procs P ON A.ID = P.TypeA)
ON B.ID = P.TypeB
salmon230 2005-09-08
  • 打赏
  • 举报
回复
学习
sunkangta1 2005-09-08
  • 打赏
  • 举报
回复
wuyi8808(tm) studio 2005  :)
你加我QQ:327626999,我给你看结果
wuyi8808 2005-09-08
  • 打赏
  • 举报
回复
string sqlShow = @"
SELECT P.ID, P.Pname AS 名称, A.Tname AS 大类, B.Tname AS 小类
FROM Procs P
LEFT JOIN TypeA A ON P.TypeA = A.ID
LEFT JOIN TypeB B ON P.TypeB = B.ID
";

我试了一下, 这个语句在 SQL Server 2000 中工作正常, 在 Access 数据库中确实不能工作.
wuyi8808 2005-09-08
  • 打赏
  • 举报
回复
楼主说会无故多出几条记录, 请把你最终使用的查询语句及查询结果贴出来, 我帮你分析分析.
wuyi8808 2005-09-08
  • 打赏
  • 举报
回复
string sqlShow = @"
SELECT P.ID, P.Pname AS 名称, A.Tname AS 大类, B.Tname AS 小类
FROM Procs P, TypeA A, TypeB B
WHERE (P.TypeA = A.ID) AND (P.TypeB = B.ID)
AND (P.ID BETWEEN 1 AND 5)
";

这种方法就不要了, 因为发现无故多出几条记录
---------------------------------------------

不可能会多出记录来的, 较之 LEFT JOIN 的版本倒是有可能少掉, 如果有

表Procs:
ID Pname TypeA TypeB
1 电视 1 11
2 手机 2 21

表TypeA
ID Tname
1 家电
2 通讯

表TypeB
ID Tname
11 影音

查询结果将是:

ID 名称 大类 小类
1 电视 家电 影音

表Procs中的第2行将不会出现在查询结果中, 因为表TypeB中没有ID为21的行, 解决办法是在表TypeB中添加ID为21的行.
sunkangta1 2005-09-08
  • 打赏
  • 举报
回复
UP
haibuo1981 2005-09-08
  • 打赏
  • 举报
回复
sql里面是没问题的 access语法不是很熟,好像有些差别的
sunkangta1 2005-09-08
  • 打赏
  • 举报
回复
问一下,以上各位用left join的是不是用Access的?
cdo 2005-09-07
  • 打赏
  • 举报
回复
SELECT Procs.ID, Procs.Pname, TypeA.TypeName, TypeB.TypeName
FROM Procs
LEFT JOIN TypeA ON Procs.TypeA = TypeA.ID
LEFT JOIN TypeB ON Procs.TypeB = TypeB.ID
wuyi8808 2005-09-07
  • 打赏
  • 举报
回复

string sqlShow = @"
SELECT P.ID, P.Pname, A.TypeName, B.TypeName
FROM Procs P, TypeA A, TypeB B
WHERE (P.TypeA = A.ID) AND (P.TypeB = B.ID)
AND (P.ID BETWEEN 1 AND 5)
";

Access 数据库就是这样用, 没问题的, 如果还有其他限制条件, 继续加在 WHERE 的后面, 如上所示.

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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