导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

一句很难写的SQL语句

mikesome 2002-08-14 06:57:09
有三张表,一张为A,里面有program_id的字段,一张为B,里面有program_id和program_name的字段,一张为C,和B一样有program_id和program_name的字段
现在我想得到这样的查询结果,就是把A的program_id对应到B的program_name或对应到C的program_name,这两个是不可能同时对应到的,也就是说,A表里面的program_id要么存在于B表,要么存在于C表。
比如B表可能有两条记录(1,ProgramA),(4,ProgramB)
C表可能也有两条记录(2,ProgramC),(3,ProgramD)
我想把A里面的program_id(它必然能对应B或C中的一条记录)对应到B或C
我写了这样的语句
select * from A,B,C where A.program_id=B.program_id or A.program_id=C.program_id
但是运行的结果并不是我想的那样,而是多出了很多(是它自己排列组合所致)
也就是语句中的or用得不对,但我又想不到更好的,求救
...全文
4 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yonghengdizhen 2002-08-14
那种在B.C两个表中都有同ID的数据,上面的查询也可以查出来.
在处理一些由于原来结构设计不合理导致的代码兼容性问题时可以得到处理.
比如说,数据库结构进行调整,可以复制原表的一些ID字段,并增加新的字段,新旧数据并存,查询时就可以用到上面的方法了.
回复
mikesome 2002-08-14
hehe,果然很简单阿,让大家见笑了,以后有SQL方面的问题,直接发信给各位了,hoho
回复
yonghengdizhen 2002-08-14
不管怎么样.上面的语句可以得到楼主想要的结果.
并且上面的语句实际上可以提供更有启发性的一种思路.
回复
yonghengdizhen 2002-08-14
如果你想得到的结果中包括后两个表都有数据的情况,上面的语句修改一下.
select A.*,Programe_XX.* from A
INNER JOIN
(select ISNULL(B.Program_ID,C.Programe_ID) AS Programe_ID, B.Program_Name AS ProgramB_Name,C.Program_Name AS ProgramC_Name FROM B FULL JOIN C ON B.Program_ID=C.Programe_ID) AS Programe_XX
ON Programe_XX.Program_ID=A.Program_ID

回复
CSDNM 2002-08-14
同意 j9988(j9988)
回复
j9988 2002-08-14
我想你可能是B.C字段不同内容不同
如B(program_id,program_name,fieldA,fieldB)
C(program_id,program_name,fieldD,fieldE)

可用
select * from A,(
select program_id,program_name,fieldA,fieldB,null as fieldD,null as fieldE from B
union all
select program_id,program_name,null as fieldA,null as fieldB,fieldD,fieldE from C ) as D
where a.program_id=d.program_id
回复
IronPromises 2002-08-14
j9988(j9988) 的理解应该是对的。
呵呵,这题不值200分。
楼主可能不知道union或者union all的用法。
回复
yonghengdizhen 2002-08-14
select A.*,Programe_XX.* from A
INNER JOIN
(select ISNULL(B.Program_ID,C.Programe_ID) AS Programe_ID, ISNULL(B.Program_Name,C.Program_Name) AS Program_Name FROM B
FULL JOIN C ON B.Program_ID=C.Programe_ID) AS Programe_XX
ON Programe_XX.Program_ID=A.Program_ID
思路大概就是这样子先将后两个表全连接然后和第一个表进行内连接.
不知T-SQL是否直接支持这样的语法.
如果不行,你可分开先做后两个表全连接的视图然后和A连接

我是在做水晶报表的时候遇到了这样的问题的,现在想想其实无非就是对集合论的理解罢了.

回复
j9988 2002-08-14
如果我没理解错的话,这题20分就够了
回复
j9988 2002-08-14
select * from A,(
select * from b
union all
select * from c) d
where a.programid=d.programid
回复
small_wei 2002-08-14
select * from A,B,C where A.program_id*=B.program_id or A.program_id*=C.program_id
试试这个
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告