SQL 多表查询,显示结果最多那个

谷林 2014-10-23 04:34:55
有三张表
主表A 、以及表B、表C

A 有一条数据、B有两条数据、C有三条数。

A.ID=B,AID
A.ID=C.AID

B和C之间没有关系

我现在想让他们之间 关联的查询结果是 三行,而不是我通过Left Join查出来的六行。


请问有什么办法么?

谢谢
...全文
495 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
frankl123 2014-10-24
  • 打赏
  • 举报
回复
大哥你贴点数据出来啊,懒死了!
qq_18878919 2014-10-24
  • 打赏
  • 举报
回复
用有三条数据的那个表做主表关联就可以了
谷林 2014-10-24
  • 打赏
  • 举报
回复
引用 12 楼 frankl123 的回复:
大哥你贴点数据出来啊,懒死了!
抱歉。这是初始化数据脚本。以及我的SQL。


USE [tempDB1]
GO
/****** Object:  Table [dbo].[A001]    Script Date: 10/24/2014 14:30:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[A001](
	[Id] [int] NOT NULL,
	[W9001] [varchar](32) NULL,
	[A0101] [varchar](32) NULL,
	[U1156] [varchar](64) NULL,
	[C0107] [varchar](32) NULL,
	[ChildDepart] [varchar](64) NULL,
	[U0001] [varchar](32) NULL,
	[A0177] [varchar](32) NULL,
	[A0107] [varchar](16) NULL,
	[A0111] [datetime] NULL,
	[U0002] [int] NULL,
 CONSTRAINT [PK_A001] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[A001] ([Id], [W9001], [A0101], [U1156], [C0107], [ChildDepart], [U0001], [A0177], [A0107], [A0111], [U0002]) VALUES (1089, N'200001', N'张三', N'rylx00030008', N'18', N'', N'JMY', N'111111111111111', N'2', CAST(0x0000545100000000 AS DateTime), 25)
INSERT [dbo].[A001] ([Id], [W9001], [A0101], [U1156], [C0107], [ChildDepart], [U0001], [A0177], [A0107], [A0111], [U0002]) VALUES (1230, N'200002', N'李四', N'rylx00020000', N'18', N'', N'THX', N'111111111111111', N'2', CAST(0x0000779E00000000 AS DateTime), 25)
/****** Object:  Table [dbo].[A002]    Script Date: 10/24/2014 14:30:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[A002](
	[Id] [int] NOT NULL,
	[A001_id] [int] NOT NULL,
	[A0405] [varchar](32) NULL,
	[A0410] [varchar](32) NULL,
	[A0415] [datetime] NULL,
	[A0420] [varchar](32) NULL,
	[A0425] [varchar](32) NULL,
	[A0430] [datetime] NULL,
	[A0435] [varchar](64) NULL,
	[A0440] [varchar](32) NULL,
	[A0445] [datetime] NULL,
	[A0450] [varchar](32) NULL,
	[A0455] [varchar](128) NULL,
	[C0206] [varchar](128) NULL,
	[C0207] [varchar](128) NULL,
	[Y0201] [varchar](32) NULL,
	[Y0202] [varchar](128) NULL,
 CONSTRAINT [PK_A002] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[A002] ([Id], [A001_id], [A0405], [A0410], [A0415], [A0420], [A0425], [A0430], [A0435], [A0440], [A0445], [A0450], [A0455], [C0206], [C0207], [Y0201], [Y0202]) VALUES (865, 1230, N'41', N'100701', CAST(0x00008E3200000000 AS DateTime), N'99', N'7', CAST(0x000093A900000000 AS DateTime), N'上海第二医科大学附属卫生学校', NULL, NULL, NULL, NULL, NULL, N'', N'1', NULL)
INSERT [dbo].[A002] ([Id], [A001_id], [A0405], [A0410], [A0415], [A0420], [A0425], [A0430], [A0435], [A0440], [A0445], [A0450], [A0455], [C0206], [C0207], [Y0201], [Y0202]) VALUES (866, 1230, N'31', N'100701', CAST(0x0000977700000000 AS DateTime), N'99', N'4', CAST(0x00009ACC00000000 AS DateTime), N'上海交通大学网络教育学院医学院分院', NULL, NULL, NULL, NULL, NULL, N'', N'2', NULL)
INSERT [dbo].[A002] ([Id], [A001_id], [A0405], [A0410], [A0415], [A0420], [A0425], [A0430], [A0435], [A0440], [A0445], [A0450], [A0455], [C0206], [C0207], [Y0201], [Y0202]) VALUES (867, 1230, N'21', N'100701', CAST(0x00009BBF00000000 AS DateTime), N'03', N'5', CAST(0x0000A2A600000000 AS DateTime), N'复旦大学继续教育学院', NULL, NULL, NULL, NULL, NULL, N'', N'2', NULL)
INSERT [dbo].[A002] ([Id], [A001_id], [A0405], [A0410], [A0415], [A0420], [A0425], [A0430], [A0435], [A0440], [A0445], [A0450], [A0455], [C0206], [C0207], [Y0201], [Y0202]) VALUES (6277, 1089, N'60', N'010199', CAST(0x0000A3D300000000 AS DateTime), N'06', N'2', CAST(0x0000A3D200000000 AS DateTime), NULL, N'390', NULL, NULL, NULL, NULL, NULL, NULL, NULL)
INSERT [dbo].[A002] ([Id], [A001_id], [A0405], [A0410], [A0415], [A0420], [A0425], [A0430], [A0435], [A0440], [A0445], [A0450], [A0455], [C0206], [C0207], [Y0201], [Y0202]) VALUES (6278, 1089, N'60', N'010201', CAST(0x0000A3CB00000000 AS DateTime), N'07', N'3', CAST(0x0000A3CB00000000 AS DateTime), NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
/****** Object:  Table [dbo].[A003]    Script Date: 10/24/2014 14:30:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[A003](
	[Id] [int] NOT NULL,
	[A001_id] [int] NOT NULL,
	[A3405] [varchar](32) NULL,
	[A3410] [varchar](32) NULL,
	[E3401] [varchar](32) NULL,
 CONSTRAINT [PK_A003] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[A003] ([Id], [A001_id], [A3405], [A3410], [E3401]) VALUES (215, 1089, N'EN', N'1', N'2')
INSERT [dbo].[A003] ([Id], [A001_id], [A3405], [A3410], [E3401]) VALUES (216, 1089, N'EL', N'1', N'3')
INSERT [dbo].[A003] ([Id], [A001_id], [A3405], [A3410], [E3401]) VALUES (217, 1089, N'EN', N'1', N'1')


/*查询*/
  SELECT    *
  FROM      tempDB1.dbo.A001 a
            JOIN dbo.A002 ON a.ID = A002.a001_ID
            JOIN dbo.A003 ON a.ID = A003.a001_ID
  WHERE     w9001 = '200001'


习惯性蹭分 2014-10-23
  • 打赏
  • 举报
回复


create table TA(id int)
insert into ta
select 1
create table TB(Aid int,val varchar(30))
insert into TB
select 1,'甲' union all
select 1,'已'
create table TC(Aid int,val varchar(30))
insert into TC
select 1,'A' union all
select 1,'B' union all
select 1,'C' 

select c.id,b.val,a.val from 
(select *,row_number() over(partition by Aid order by getdate()) as rn from TC) a
  left join 
(select *,row_number() over(partition by Aid order by getdate()) as rn from TB) b
on a.Aid=b.Aid and a.rn=b.rn
left join 
(select *,row_number() over(order by id) as rn from TA) c
on a.aid=c.id  and a.rn=c.rn
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
我没用你的这个序号 我用的是 行号 ROW_NUMBER()OVER(ORDER BY GETDATE()) 上面写错了要加个ORDER BY 你需要用你的序号顺序合并吗? 要的话,参考如下
SELECT
    A.序号,B.序号,C.序号
FROM
    (SELECT ROW_NUMBER()OVER(ORDER BY C.序号)RN,C.* FROM C)T3
    LEFT JOIN(SELECT ROW_NUMBER()OVER(ORDER BY B.序号)RN,B.* FROM B)T2 ON B.RN=C.RN
    LEFT JOIN(SELECT ROW_NUMBER()OVER(ORDER BY A.序号)RN,A.* FROM A)T1 ON A.RN=C.RN
谷林 2014-10-23
  • 打赏
  • 举报
回复
引用 8 楼 ky_min 的回复:
SELECT
	A.ID,B.ID,C.ID
	--这边各表的字段你随便加
FROM
	(SELECT ROW_NUMBER()OVER(GETDATE())RN,C.ID FROM C)T3
	LEFT JOIN(SELECT ROW_NUMBER()OVER(GETDATE())RN,B.ID FROM B)T2 ON B.RN=C.RN
	LEFT JOIN(SELECT ROW_NUMBER()OVER(GETDATE())RN,A.ID FROM A)T1 ON A.RN=C.RN
数据多的左连接少的 就是你要的数据
不行的啊 ,那个序号,在应用中是不一样的啊。比如主表 是1。 B 20、23、c:150、151、152 无法相等啊
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
SELECT
	A.ID,B.ID,C.ID
	--这边各表的字段你随便加
FROM
	(SELECT ROW_NUMBER()OVER(GETDATE())RN,C.ID FROM C)T3
	LEFT JOIN(SELECT ROW_NUMBER()OVER(GETDATE())RN,B.ID FROM B)T2 ON B.RN=C.RN
	LEFT JOIN(SELECT ROW_NUMBER()OVER(GETDATE())RN,A.ID FROM A)T1 ON A.RN=C.RN
数据多的左连接少的 就是你要的数据
卖水果的net 2014-10-23
  • 打赏
  • 举报
回复
我猜想 , 表 B 和表 C 的 ID 都是重复的的。 比如都是 1 ; 这样出来的结果,就是 2 * 3 = 6 行。
谷林 2014-10-23
  • 打赏
  • 举报
回复
1 甲 一 NULL 已 二 NULL NULL 三
引用 5 楼 ky_min 的回复:
假设A有一条数据 1 B有数据为 1 甲 1 乙 C有数据为 1 一 1 二 1 三 照你的意思,最后的数据长什么样
1 甲 一 NULL 已 二 NULL NULL 三
还在加载中灬 2014-10-23
  • 打赏
  • 举报
回复
假设A有一条数据 1 B有数据为 1 甲 1 乙 C有数据为 1 一 1 二 1 三 照你的意思,最后的数据长什么样
谷林 2014-10-23
  • 打赏
  • 举报
回复
引用 2 楼 ap0405140 的回复:
try this,

select [字段列表] 
from 表A a
inner join
(select AID,[其他字段列表] from 表B 
 union all
 select AID,[其他字段列表] from 表C) d on a.ID=d.AID
B表和C表的结构是不一样的 消息 205,级别 16,状态 1,第 1 行 使用 UNION、INTERSECT 或 EXCEPT 运算符合并的所有查询必须在其目标列表中有相同数目的表达式。
谷林 2014-10-23
  • 打赏
  • 举报
回复
引用 1 楼 fredrickhu 的回复:
inner join应该是3行
还是六行啊
唐诗三百首 2014-10-23
  • 打赏
  • 举报
回复
try this,

select [字段列表] 
from 表A a
inner join
(select AID,[其他字段列表] from 表B 
 union all
 select AID,[其他字段列表] from 表C) d on a.ID=d.AID
--小F-- 2014-10-23
  • 打赏
  • 举报
回复
inner join应该是3行

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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