关于一对多表的数据库查询(100分)

  • 主题发起人 主题发起人 yssj
  • 开始时间 开始时间
Y

yssj

Unregistered / Unconfirmed
GUEST, unregistred user!
有A、B两个表
企业表: A 企业编号、企业名称、地址、邮编
联系人表: B 企业编号、联系人姓名、联系人职务
两表之间的关系:一个企业对应多个联系人
现在需要实现的报表效果(打印信封):
邮 编
地址
企业名称
联系人姓名(收)------------如果联系人表中,有联系人职务是销售总经理的,填销售总经理的姓名,如果没有销售总经理的,固定填负责人收
寄出地址-------
         310000

现在的难题是:
1、 如果用 select * from A,B where A.企业编号=B.企业编号
---那么没有联系人的企业将查询不到
2、 如果用 select * from A left join outer B on A.企业编号=B.企业编号
----那么如果一个企业有多个联系人,则会显示所有联系人的记录,这样数据就有相对上的重复(企业重复)
3、 如果用 select * from A left join outer B on A.企业编号=B.企业编号 where联系人职务=销售总经理
-----那么联系人表中没能销售总经理职务的企业将查询不到
寻求解决方法:在不改变企业表结构,可改变联系人表结构的方式上,正确的SQL语句
 
SELECT 企业编号,企业名称,地址,邮编,
(SELECT TOP 1 联系人姓名 FROM B BBB WHERE BBB.企业编号=AAA.企业编号) AS 联系人姓名,
(SELECT TOP 1 联系人职务 FROM B BBB WHERE BBB.企业编号=AAA.企业编号) AS 联系人职务
FROM A AAA
在两个select top 1 中选择加入相同的排序order by语句来决定
取得排序后的第一条记录的 联系人姓名和联系人职务
 
select A.企业名称,A.地址,A.邮编,
B.企业编号,B.联系人姓名,B.联系人职务
from A,B
where B.联系人职务='销售总经理'
and A.企业编号=B.企业编号
union
select A.企业名称,A.地址,A.邮编,
A.企业编号,'负责人' as 联系人姓名,B.联系人职务
from A,B
where A.企业编号 not in (select A.企业编号
from A, B
where B.联系人职务='销售总经理'
and A.企业编号=B.企业编号 )
 
经过测试以下语句可行
select * from A,B where A.企业编号*=B.企业编号 where 联系人职务=销售总经理

select * from A left outer join B where A.企业编号=B.企业编号 and 联系人职务=销售总经理
不知大家还有没有其它方法
 
a企业表: A 企业编号、企业名称、地址、邮编
b联系人表: B 企业编号、联系人姓名、联系人职务
select a.企业编号,a.企业名称,a.地址,a.邮编,c.联系人姓名
from a left join (select 企业编号,联系人姓名,联系人职务 from b where 联系人职务=‘销售总经理')c
on a.企业编号=c。企业编号
 
警告:一个问题不要多次提交
 

Similar threads

S
回复
0
查看
804
SUNSTONE的Delphi笔记
S
S
回复
0
查看
691
SUNSTONE的Delphi笔记
S
S
回复
0
查看
724
SUNSTONE的Delphi笔记
S
后退
顶部