四个表联接查询。请高手帮忙啊。呜呜。

dingliang106 2009-11-16 09:25:50




四个表之间的关系大概是这样。
查询服务的时候。记录要显示该服务对应的客户名称,合同名称,产品名称。如果一个服务只是针对合同的。那么该服务的ClientId和ProductId为0.而显示的客户信息。则是合同对应的客户。如果该服务针对产品。那么客户和合同编号为零。客户信息和合同信息时产品所对应的信息。

不知道我有没有说清楚。我把我写的SQL贴出来。

select m.id as '编号',m.fuwunumber as '服务编号',c.name as '客户名称',i.name as '合同名称',i.itemId as '合同编号',p.equipmentName as '设备名称',p.number as '设备序列号',m.maintenanceEngineer as '维修工程师',m.maintenanceDate as '维修时间',m.gzhunbei as '客户对工程师准备情况',m.gwancheng as '客户对工程师工作完成情况',m.gfenxi as '客户对工程师分析解决问题评价',m.ghuanjing as '客户对工程师环境整理情况',m.gtaidu as '客户对工程师工作态度评价',m.gzuoxi as '客户对工程师遵守作息情况',m.clientyijian as '客户意见',m.serviceType as '服务类型',m.isComeDown as '服务费',m.conkOutDiscription as '工作内容',m.feeDiscription as '遗留问题',m.insteadAndFee as '已解决问题',m.isInstead as '是否更换配件',m.isHavaService as '是否需要软件服务' from MaintenanceInfo m,ProductInfo p,ItemsInfo i,ClientInfo c where m.productId=p.id and p.itemsId=i.id and i.clientId=c.id order by m.maintenanceDate desc


这个SQL语句存在一个问题。就是客户,合同,产品到服务一串联起来的时候没有问题。比如中间产品信息不存在的。就是PRODUCTID为0.就查不出来。很困扰啊。希望高手能帮忙分析分析。是数据库设计的有问题还是我的SQL 写的有问题。可以加分啊。。。如果我说的大家没有明白。请加QQ178739581。。请会的哥们务必帮帮忙啊。小弟在此先谢过啦。
...全文
332 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingliang106 2009-11-20
  • 打赏
  • 举报
回复
谁来做做这个帖子??谢谢啦。。
dingliang106 2009-11-19
  • 打赏
  • 举报
回复
Client
Id Int
Name Varchar
Address Varchar
LikeMan Varchar
Tel varchar
Contract
Id Int
Name Varchar
Number Varchar
ClientId Int

Product
Id Int
Name Varchar
ClientId Int
ContractId Int

Service
Id Int
Name Varchar
ClientId Int
ContractId Int
ProductId Int

图片发不上来。您卡看这样能看明白吗。
dawugui 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 dingliang106 的回复:]
让这个帖子再次浮起吧。同事们我需要你们的帮助。上面yanglinqiang的语句我研究了一下。似乎有些头绪。可是还是达不到需求。我在完善一下数据。希望可以有人解决下这个问题。第四天啦。我实在找不到办法了。
ClientInfo
id    name  linkMan tel
1    创新工厂  李开复  13912345121
2    网易      丁磊  13812345121

ItemsInfo
id    name          date        clientId
1  创新工厂机床采购    2009-11-17      1
2  网易一卡通代理发行  2009-11-17      2

ProductInfo
id    name          number      itemsId      clientId
1    一个非常好的主意    123        1              1
2    新发行3000点点卡    234        2              2
3    不知名产品          345        0              1

MaintenanceInfo
id      name    productId      itemsId      clientId
1      维护机床      0              1            1
2      制造主意      1              1            1
3      帮李总装系统  0              0            1
4      推销点卡      2              2            2
5      test        0              3            1
6      特色特        3              0            1
7      test        1              0            0
8      testtest    2              0            0
9      111        3              0            0
yanglinqiang写的SQL中M.clientId=C.id。显然上面的数据中没有出现clientId为0的情况。现在的问题是如果itemsId和clientId为0时。如何通过productId查出他们。因为从productId到itemsId到clientId一次是多对一的关系。结果应该如下。

编号      服务名称      客户名称      合同名称      产品名称
1        维护机床      创新工厂    创新工厂机床采购    NULL
2        制造主意      创新工厂    创新工厂机床采购  一个非常好的主意
3        帮李总装系统  创新工厂    NULL              NULL
4        推销嗲卡      网易        网易一卡通代理    新发行3000点点卡
5        TEST        创新工厂    (这里编号写错)    NULL
6        特色特        创新工厂    NULL    不知名产品
7        TEST        创新工厂    创新工厂机床采购  一个非常好的主意
8        TESTTEST    网易        网易一卡通代理    新发行3000点点卡
9        111        创新工厂    NULL              不知名产品
[/Quote]看不懂你的结果,你的表是怎么关联的?
dingliang106 2009-11-19
  • 打赏
  • 举报
回复
让这个帖子再次浮起吧。同事们我需要你们的帮助。上面yanglinqiang的语句我研究了一下。似乎有些头绪。可是还是达不到需求。我在完善一下数据。希望可以有人解决下这个问题。第四天啦。我实在找不到办法了。
ClientInfo
id name linkMan tel
1 创新工厂 李开复 13912345121
2 网易 丁磊 13812345121

ItemsInfo
id name date clientId
1 创新工厂机床采购 2009-11-17 1
2 网易一卡通代理发行 2009-11-17 2

ProductInfo
id name number itemsId clientId
1 一个非常好的主意 123 1 1
2 新发行3000点点卡 234 2 2
3 不知名产品 345 0 1

MaintenanceInfo
id name productId itemsId clientId
1 维护机床 0 1 1
2 制造主意 1 1 1
3 帮李总装系统 0 0 1
4 推销点卡 2 2 2
5 test 0 3 1
6 特色特 3 0 1
7 test 1 0 0
8 testtest 2 0 0
9 111 3 0 0
yanglinqiang写的SQL中M.clientId=C.id。显然上面的数据中没有出现clientId为0的情况。现在的问题是如果itemsId和clientId为0时。如何通过productId查出他们。因为从productId到itemsId到clientId一次是多对一的关系。结果应该如下。

编号 服务名称 客户名称 合同名称 产品名称
1 维护机床 创新工厂 创新工厂机床采购 NULL
2 制造主意 创新工厂 创新工厂机床采购 一个非常好的主意
3 帮李总装系统 创新工厂 NULL NULL
4 推销嗲卡 网易 网易一卡通代理 新发行3000点点卡
5 TEST 创新工厂 (这里编号写错) NULL
6 特色特 创新工厂 NULL 不知名产品
7 TEST 创新工厂 创新工厂机床采购 一个非常好的主意
8 TESTTEST 网易 网易一卡通代理 新发行3000点点卡
9 111 创新工厂 NULL 不知名产品
icelovey 2009-11-18
  • 打赏
  • 举报
回复
关注一下
xiedi1209 2009-11-18
  • 打赏
  • 举报
回复
我也非常头痛这种表的联查 诶
dingliang106 2009-11-18
  • 打赏
  • 举报
回复
非常感谢yanglinqiang。。
谢谢你这么用心的帮忙。不过问题还是没有解决。您写的SQL在合同和客户都为NULL的时候依然查不到数据。不过还是谢谢您。
yanglinqiang 2009-11-17
  • 打赏
  • 举报
回复

select m.id as '?号',
m.fuwunumber as '服??号',
c.name as '客?名称',
i.name as '合同名称',
i.itemId as '合同?号'
from ((MaintenanceInfo m
left join ProductInfo p on m.productId = p.id)
left join ItemsInfo i on m.itemsId = i.id)
left join ClientInfo c on m.clientId = c.id
order by m.maintenanceDate desc

关联的表用括号括起来。
dingliang106 2009-11-17
  • 打赏
  • 举报
回复
ClientInfo
id name linkMan tel
1 创新工厂 李开复 13912345121
2 网易 丁磊 13812345121

ItemsInfo
id name date clientId
1 创新工厂机床采购 2009-11-17 1
2 网易一卡通代理发行 2009-11-17 2

ProductInfo
id name number itemsId clientId
1 一个非常好的主意 123 1 1
2 新发行3000点点卡 234 2 2
3 不知名产品 345 0 1

MaintenanceInfo
id name productId itemsId clientId
1 维护机床 0 1 1
2 制造主意 1 1 1
3 帮李总装系统 0 0 1
4 推销点卡 2 2 2
5 test 0 3 1
6 特色特 3 0 1

我需要的结果
客户名称 合同名称 产品名称 服务名称 ……
需要把所有的服务都查出来。
yanglinqiang 2009-11-17
  • 打赏
  • 举报
回复
你弄几条数据来,不用把所有字段都列出来,关联字段列出来就行。然后再贴出你要的结果。肯定有人帮你解决。你把所有字段列出来来了,表的关系没说清楚,再牛的人也解决不了问题啊。
dingliang106 2009-11-17
  • 打赏
  • 举报
回复
视图一个效果。我上面列的那几种情况。如何用SQL来判断我做不到。正在学习SQL语法中。希望各位有好办法帮帮我。谢谢啦
yanglinqiang 2009-11-17
  • 打赏
  • 举报
回复
楼主用视图试过没?
dingliang106 2009-11-17
  • 打赏
  • 举报
回复


select m.id as '编号',m.fuwunumber as '服务编号',c.name as '客户名称',i.name as '合同名称',i.itemId as '合同编号',p.equipmentName as '设备名称',p.number as '设备序列号',m.maintenanceEngineer as '维修工程师',m.maintenanceDate as '维修时间',m.gzhunbei as '客户对工程师准备情况',m.gwancheng as '客户对工程师工作完成情况',m.gfenxi as '客户对工程师分析解决问题评价',m.ghuanjing as '客户对工程师环境整理情况',m.gtaidu as '客户对工程师工作态度评价',m.gzuoxi as '客户对工程师遵守作息情况',m.clientyijian as '客户意见',m.serviceType as '服务类型',m.isComeDown as '服务费',m.conkOutDiscription as '工作内容',m.feeDiscription as '遗留问题',m.insteadAndFee as '已解决问题',m.isInstead as '是否更换配件',m.isHavaService as '是否需要软件服务' from MaintenanceInfo m,ProductInfo p,ItemsInfo i,ClientInfo c


结果需要显示这些东西。。
dingliang106 2009-11-17
  • 打赏
  • 举报
回复

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ClientInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ClientInfo]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ItemsInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ItemsInfo]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ProductInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[ProductInfo]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MaintenanceInfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[MaintenanceInfo]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FenLei]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[FenLei]
GO

CREATE TABLE [dbo].[ClientInfo] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[number] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[address] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[linkMan] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[business] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[telephone] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[phone] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[mail] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[fax] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[qq] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[msn] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[fenLeiId] [int] NULL ,
[datetime] [datetime] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ItemsInfo] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[itemId] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[itemAmaldar] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[itemCompleteDate] [datetime] NULL ,
[ClientId] [int] NULL ,
[itemsType] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[clientMan] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[clientLikeMan] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[clientLikeTel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[ProductInfo] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[equipmentName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[number] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[productWorkOffDate] [datetime] NULL ,
[productTimeLimit] [int] NULL ,
[productCrossDate] [datetime] NULL ,
[clientApproving] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[clientAtticude] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[itemsId] [int] NULL ,
[productCount] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[remark] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[clientId] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[MaintenanceInfo] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[serviceType] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[maintenanceEngineer] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[conkOutDiscription] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[maintenanceDate] [datetime] NULL ,
[isComeDown] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[feeDiscription] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[isInstead] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[isHavaService] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[insteadAndFee] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[productId] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[fuwufei] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[clientyijian] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[gzhunbei] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[gwancheng] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[gfenxi] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[ghuanjing] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[gtaidu] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[gzuoxi] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[fuwunumber] [varchar] (500) COLLATE Chinese_PRC_CI_AS NULL ,
[clientId] [int] NULL ,
[itemsId] [int] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[FenLei] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[typeName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[parentId] [int] NULL
) ON [PRIMARY]
GO


yanglinqiang 2009-11-17
  • 打赏
  • 举报
回复

create table ClientInfo(id int,[name] varchar(20),linkMan varchar(20),tel varchar(20))
insert into ClientInfo
select '1','创新工厂','李开复','13912345121'
union all select '2','网易','丁磊','13812345121'

create table ItemsInfo(id int,[name] varchar(40),date datetime,clientId int)
insert into ItemsInfo
select '1','创新工厂机床采购','2009-11-17','1'
union all select '2','网易一卡通代理发行','2009-11-17','2'

create table ProductInfo(id int,[name] varchar(40), number int,itemsId int,clientId int)
insert into ProductInfo
select '1','一个非常好的主意','123','1','1'
union all select '2','新发行3000点点卡','234','2','2'
union all select '3','不知名产品','345','0','1'

create table MaintenanceInfo(id int,[name] varchar(40),productId int,itemsId int,clientId int)
insert into MaintenanceInfo
select '1','维护机床','0','1','1'
union all select '2','制造主意','1','1','1'
union all select '3','帮李总装系统','0','0','1'
union all select '4','推销点卡','2','2','2'
union all select '5','test','0','3','1'
union all select '6','特色特','3','0','1'

select M.[name],C.[name],I.[name],P.[name]
from ((MaintenanceInfo M left join ProductInfo P on M.productId=P.id)
left join ItemsInfo I on M.itemsId=I.id),ClientInfo C
where M.clientId=C.id
--结果
------------------
--维护机床 创新工厂 创新工厂机床采购 NULL
--制造主意 创新工厂 创新工厂机床采购 一个非常好的主意
--帮李总装系统 创新工厂 NULL NULL
--推销点卡 网易 网易一卡通代理发行 新发行3000点点卡
--test 创新工厂 NULL NULL
--特色特 创新工厂 NULL 不知名产品
dingliang106 2009-11-17
  • 打赏
  • 举报
回复
编号 服务名称 客户名称 合同名称 产品名称
1 维护机床 创新工厂 创新工厂机床采购 NULL
2 制造主意 创新工厂 创新工厂机床采购 一个非常好的主意
3 帮李总装系统 创新工厂 NULL NULL
4 推销嗲卡 网易 网易一卡通代理 新发行3000点点卡
5 TEST 创新工厂 (这里编号写错) NULL
6 特色特 创新工厂 NULL 不知名产品

就是这样。兄台。能加我QQ吗178739581
yanglinqiang 2009-11-17
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 dingliang106 的回复:]
ClientInfo
id    name  linkMan tel
1    创新工厂  李开复  13912345121
2    网易      丁磊  13812345121

ItemsInfo
id    name          date        clientId
1  创新工厂机床采购    2009-11-17      1
2  网易一卡通代理发行  2009-11-17      2

ProductInfo
id    name          number      itemsId      clientId
1    一个非常好的主意    123        1              1
2    新发行3000点点卡    234        2              2
3    不知名产品          345        0              1

MaintenanceInfo
id      name    productId      itemsId      clientId
1      维护机床      0              1            1
2      制造主意      1              1            1
3      帮李总装系统  0              0            1
4      推销点卡      2              2            2
5      test        0              3            1
6      特色特        3              0            1

我需要的结果
客户名称  合同名称  产品名称  服务名称 ……
需要把所有的服务都查出来。
[/Quote]
以这些数据为例,把你要的正确结果写出来(客户名称 合同名称 产品名称 服务名称就这四个字段)
楼主再加加油,既然到这一步了,千万别放弃啊
dingliang106 2009-11-17
  • 打赏
  • 举报
回复
咋办??咋办??我在这里等了两天了。。自己也试过了N多办法。都不行。急死我了。人越急的时候越解决不了问题。哪位大哥安慰安慰小弟。难道是我没把问题说清楚吗??
C江海 2009-11-17
  • 打赏
  • 举报
回复
过来关注下
yantaohncz 2009-11-17
  • 打赏
  • 举报
回复
老大会有很多记录重复
加载更多回复(31)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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