问一下各位,怎么把两个小表拼接成一张大表?

gzhosp_redAnt 2018-12-11 09:46:52
最近公司要对数据库进行导入,然后有些表是由其他表合并而来,有些事分来而来的。这里主要问问大家关于小表拼接为大表的问题。
假设这里有两张小表T1跟T2:


然后目标是合成这样的一张表T3:


所以问问大家有没有什么办法做到?怎么实现呢?(假设T1的主键是studentNum)
PS:本人平时多参与的是客户端跟服务端开发,对于数据库不甚理解,希望大家多多帮助,感谢
...全文
191 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzhosp_redAnt 2018-12-11
  • 打赏
  • 举报
回复
引用 7 楼 二月十六 的回复:
有外键就这样操作
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([studentnum] int,[name] nvarchar(26),[Age] int)
Insert #T1
select 20048,N'liming',21 union all
select 90031,N'jojo',20
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([sex] nvarchar(21),[stuAdderss] nvarchar(23),[city] nvarchar(22),[studentnum] INT )
Insert #T2
select N'男',N'天河区',N'广州',20048 union all
select N'女',N'宝安区',N'深圳',90031
Go
--测试数据结束
SELECT #T1.studentnum,
#T1.name,
#T1.Age,
#T2.sex,
#T2.stuAdderss,
#T2.city
FROM #T1
JOIN #T2
ON #T2.studentnum = #T1.studentnum; --通过外键关联


感谢回答
gzhosp_redAnt 2018-12-11
  • 打赏
  • 举报
回复
引用 6 楼 吉普赛的歌 的回复:
T2 有 studentNum , 那要处理就简洁很多了:
关联一下就可以:
USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
IF OBJECT_ID('t3') IS NOT NULL DROP TABLE t3
GO
CREATE TABLE t1(
studentNum BIGINT,
[name] NVARCHAR(20),
Age INT
)
GO
CREATE TABLE t2(
studentNum BIGINT,
sex NCHAR(1),
stuAddress NVARCHAR(30),
city NVARCHAR(20)
)
GO
CREATE TABLE t3(
studentNum BIGINT,
[name] NVARCHAR(20),
Age INT,
sex NCHAR(1),
stuAddress NVARCHAR(20),
city NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO t1 VALUES (15209020048,'liming',21)
INSERT INTO t1 VALUES (14609090031,'jojo',20)
INSERT INTO t2 VALUES (15209020048,'男','天河区','广州')
INSERT INTO t2 VALUES (14609090031,'女','宝安区','深圳')

--插入
INSERT INTO [dbo].[t3]
([studentNum]
,[name]
,[Age]
,[sex]
,[stuAddress]
,[city])
SELECT
t1.studentNum
,t1.[name]
,t1.Age
,t2.sex
,t2.stuAddress
,t2.city
FROM t1
INNER JOIN t2
ON t1.studentNum=t2.studentNum

--查询
SELECT * FROM t3
/*
studentNum name Age sex stuAddress city
-------------------- -------------------- ----------- ---- -------------------- --------------------
15209020048 liming 21 男 天河区 广州
14609090031 jojo 20 女 宝安区 深圳
*/

感谢回答。代码看懂了。原来有join这种用法,看来以后要多多补数据库的知识了 ,谢谢
二月十六 2018-12-11
  • 打赏
  • 举报
回复
有外键就这样操作
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([studentnum] int,[name] nvarchar(26),[Age] int)
Insert #T1
select 20048,N'liming',21 union all
select 90031,N'jojo',20
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([sex] nvarchar(21),[stuAdderss] nvarchar(23),[city] nvarchar(22),[studentnum] INT )
Insert #T2
select N'男',N'天河区',N'广州',20048 union all
select N'女',N'宝安区',N'深圳',90031
Go
--测试数据结束
SELECT #T1.studentnum,
#T1.name,
#T1.Age,
#T2.sex,
#T2.stuAdderss,
#T2.city
FROM #T1
JOIN #T2
ON #T2.studentnum = #T1.studentnum; --通过外键关联


吉普赛的歌 2018-12-11
  • 打赏
  • 举报
回复
T2 有 studentNum , 那要处理就简洁很多了: 关联一下就可以:
USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
IF OBJECT_ID('t3') IS NOT NULL DROP TABLE t3
GO
CREATE TABLE t1(
	studentNum BIGINT,
	[name] NVARCHAR(20),
	Age INT	
)
GO
CREATE TABLE t2(
	studentNum BIGINT,
	sex NCHAR(1),
	stuAddress NVARCHAR(30),
	city NVARCHAR(20)	
)
GO
CREATE TABLE t3(
	studentNum BIGINT,
	[name] NVARCHAR(20),
	Age INT,
	sex NCHAR(1),
	stuAddress NVARCHAR(20),
	city NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO t1 VALUES (15209020048,'liming',21)
INSERT INTO t1 VALUES (14609090031,'jojo',20)
INSERT INTO t2 VALUES (15209020048,'男','天河区','广州')
INSERT INTO t2 VALUES (14609090031,'女','宝安区','深圳')

--插入
INSERT INTO [dbo].[t3]
           ([studentNum]
           ,[name]
           ,[Age]
           ,[sex]
           ,[stuAddress]
           ,[city])
SELECT 
t1.studentNum
,t1.[name]
,t1.Age
,t2.sex
,t2.stuAddress
,t2.city 
FROM t1
INNER JOIN t2
ON t1.studentNum=t2.studentNum

--查询
SELECT * FROM t3
/*
studentNum           name                 Age         sex  stuAddress           city
-------------------- -------------------- ----------- ---- -------------------- --------------------
15209020048          liming               21          男    天河区                  广州
14609090031          jojo                 20          女    宝安区                  深圳
 */

 
gzhosp_redAnt 2018-12-11
  • 打赏
  • 举报
回复
引用 3 楼 吉普赛的歌 的回复:
下面的, 只算是“凑”出来了, 但不是很合理。
除非你能保证每个学生每一行都能正常对应, 但事实上这是很困难的。
按正常来说, 你的 t2 表应该有一个 studentNum , 这样才能正常的关联。

USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
IF OBJECT_ID('t3') IS NOT NULL DROP TABLE t3
GO
CREATE TABLE t1(
studentNum BIGINT,
[name] NVARCHAR(20),
Age INT
)
GO
CREATE TABLE t2(
sex NCHAR(1),
stuAddress NVARCHAR(30),
city NVARCHAR(20)
)
GO
CREATE TABLE t3(
studentNum BIGINT,
[name] NVARCHAR(20),
Age INT,
sex NCHAR(1),
stuAddress NVARCHAR(20),
city NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO t1 VALUES (15209020048,'liming',21)
INSERT INTO t1 VALUES (14609090031,'jojo',20)
INSERT INTO t2 VALUES ('男','天河区','广州')
INSERT INTO t2 VALUES ('女','宝安区','深圳')

--插入
INSERT INTO [dbo].[t3]
([studentNum]
,[name]
,[Age]
,[sex]
,[stuAddress]
,[city])
SELECT
t11.studentNum
,t11.[name]
,t11.Age
,t22.sex
,t22.stuAddress
,t22.city
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS rid, * FROM t1
) AS t11
INNER JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS rid, * FROM t2
) AS t22
ON t11.rid=t22.rid

--查询
SELECT * FROM t3
/*
studentNum name Age sex stuAddress city
-------------------- -------------------- ----------- ---- -------------------- --------------------
15209020048 liming 21 男 天河区 广州
14609090031 jojo 20 女 宝安区 深圳
*/

那如果按你所说的,T2有这样的一个studentNum,可以相互关联,那么这样处理起来会方便很多吗?如何处理呢?谢谢,我数据库很糟糕,希望能写写代码看看
gzhosp_redAnt 2018-12-11
  • 打赏
  • 举报
回复
引用 1 楼 二月十六 的回复:
T2没有外键吗?怎么和T1关联?
那假如T2也存在studentNum的话呢(或者按你说的也存在外键,那么又该怎么进行处理呢?)
吉普赛的歌 2018-12-11
  • 打赏
  • 举报
回复
下面的, 只算是“凑”出来了, 但不是很合理。 除非你能保证每个学生每一行都能正常对应, 但事实上这是很困难的。 按正常来说, 你的 t2 表应该有一个 studentNum , 这样才能正常的关联。
USE tempdb
GO
IF OBJECT_ID('t1') IS NOT NULL DROP TABLE t1
IF OBJECT_ID('t2') IS NOT NULL DROP TABLE t2
IF OBJECT_ID('t3') IS NOT NULL DROP TABLE t3
GO
CREATE TABLE t1(
	studentNum BIGINT,
	[name] NVARCHAR(20),
	Age INT	
)
GO
CREATE TABLE t2(
	sex NCHAR(1),
	stuAddress NVARCHAR(30),
	city NVARCHAR(20)	
)
GO
CREATE TABLE t3(
	studentNum BIGINT,
	[name] NVARCHAR(20),
	Age INT,
	sex NCHAR(1),
	stuAddress NVARCHAR(20),
	city NVARCHAR(20)
)
GO
SET NOCOUNT ON
INSERT INTO t1 VALUES (15209020048,'liming',21)
INSERT INTO t1 VALUES (14609090031,'jojo',20)
INSERT INTO t2 VALUES ('男','天河区','广州')
INSERT INTO t2 VALUES ('女','宝安区','深圳')

--插入
INSERT INTO [dbo].[t3]
           ([studentNum]
           ,[name]
           ,[Age]
           ,[sex]
           ,[stuAddress]
           ,[city])
SELECT 
t11.studentNum
,t11.[name]
,t11.Age
,t22.sex
,t22.stuAddress
,t22.city 
FROM 
(
	SELECT ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS rid, * FROM t1
) AS t11
INNER JOIN
(
	SELECT ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS rid, * FROM t2
) AS t22
ON t11.rid=t22.rid

--查询
SELECT * FROM t3
/*
studentNum           name                 Age         sex  stuAddress           city
-------------------- -------------------- ----------- ---- -------------------- --------------------
15209020048          liming               21          男    天河区                  广州
14609090031          jojo                 20          女    宝安区                  深圳
 */

 
二月十六 2018-12-11
  • 打赏
  • 举报
回复
没有关联键的话,就第一条对第一条?
--测试数据
if not object_id(N'Tempdb..#T1') is null
drop table #T1
Go
Create table #T1([studentnum] int,[name] nvarchar(26),[Age] int)
Insert #T1
select 20048,N'liming',21 union all
select 90031,N'jojo',20
GO
if not object_id(N'Tempdb..#T2') is null
drop table #T2
Go
Create table #T2([sex] nvarchar(21),[stuAdderss] nvarchar(23),[city] nvarchar(22))
Insert #T2
select N'男',N'天河区',N'广州' union all
select N'女',N'宝安区',N'深圳'
Go
--测试数据结束
SELECT t1.studentnum,t1.name,t1.Age,t2.sex,t2.stuAdderss,t2.city FROM (
Select *,ROW_NUMBER()OVER(ORDER BY GETDATE()) rn from #T1)t1
JOIN (SELECT *,ROW_NUMBER()OVER(ORDER BY GETDATE()) rn FROM #T2 )t2
ON t2.rn = t1.rn


二月十六 2018-12-11
  • 打赏
  • 举报
回复
T2没有外键吗?怎么和T1关联?

27,579

社区成员

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

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