SQL Server数据库多表关联如何更新?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server数据库多表关联如何更新?相关的知识,希望对你有一定的参考价值。

现有两个表,表中第一个字段为主键。车票表:(车票号,总票数,已售票数,剩余票数)订单表:(订单号,车票号,预订数量),即cpb:(cph,zps,ysps,syps) ddb:(ddh,cph,ydsl),当订单表中的“预订数量(ydsl)”改变时,车票表中的“已售票数(ysps)”、“剩余票数(syps)”也要随之更改,这样的SQL语句怎么写?在线等待,非常感谢!

一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表

一、MS SQL Server 多表关联更新
sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式 中引用要更新的表以外的其它数据。
一般形式:
update A SET 字段1=B表字段表达式, 字段2=B表字段表达式 from B WHERE 逻辑表达式
例如:
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的
参考技术A 亲,这个不是写sql语句,是改数据库的更新规则
选择“数据库”菜单 然后“编辑参照完整性”打开参照完整性生成器,在“更新规则”选项卡中选择“级联”即可追问

没找到你说的菜单选项呀

追答

可以等下吗?我现在在上课,回去给你找像

照相看

追问

你有时间再发,会等着的!

追答

(^_^)好的

我现在还在上课

这个就是“数据库”菜单

怎么样?

找到没有?

追问

没找到,我用的是SQL Server 2005

追答

(⊙o⊙)那我就不知道了

我只学了visual foxpro和autoCAD

参考技术B select 车票号,sum(a.总票数) as 总票数
,sum(a.已售票数 + b.预订数量) as 已售票数
,sum(a.总票数 - a.已售票数 - b.预订数量) as 剩余票
from 车票表 a left join 订单表 b on a.车票号 = b.车票号
group by a.车票号
纯技术活,求大哥赏点分吧!追问

我想要两个表关联更新不产生新表,只更新原来的两个表中的数据。但你所给的方法生成了新表,原来的车票表中数据依然没变

追答

你用什么编程语言?

追问

asp.net下的C#编程

追答

update 车票表 set 已售票数 = 已售票数 + :预订数量,剩余票数 = - :预订数量
说明:其中的:预订数量为参数,当每一次更新预订数量时做此操作

参考技术C SQL Server语法:UPDATE table_name WITH ( < table_hint_limited > [ ...n ] ) |
view_name | rowset_function_limited SET column_name = expression | DEFAULT
| NULL | @variable = expression | @variable = column = expression [ ,...n ]
[ FROM < table_source > [ ,...n ] ] [ WHERE < search_condition > ] | [
WHERE CURRENT OF [ GLOBAL ] cursor_name | cursor_variable_name ] [
OPTION ( < query_hint > [ ,...n ] ) ]

SQL Server示例: update a set a.gqdltks=b.gqdltks,a.bztks=b.bztks from

landleveldata a,gdqlpj b where a.GEO_Code=b.lxqdm

求助各位大神,sql server两表间一对多的关系,如何数据整合到一行数据中,问题举例在问题补充中。谢谢..

有两张表,其中一张是学生表(student),另一张是各科成绩表(grade),各表包含的字段如下:
student学生信息表
-----------------------------------------------------
id varchar 学生编号
name varchar 学生姓名

score 学生成绩表
-----------------------------------------------------
id varchar 编号
student_id varchar 学生编号
curse_name varchar 课程名称
score float 成绩

示例数据:
student
id name
1 小李
2 小王

score
id student_id curse_name score
1 1 语文 80
2 2 语文 85
3 1 数学 90
4 2 数学 85

问题:如何通过sql语句得到下面格式的数据?
student_id sdudent_name 语文成绩 数学成绩
1 小李 80 90
2 小王 85 85

SQL SERVER 2005+实现行列互转可以用PIVOT和UNPIVOT
这个是实现:
SELECT * FROM (
SELECT sc.student_id,st.name,curse_name,score FROM student st JOIN score sc ON st.id=sc.student_id) AS T
PIVOT(SUM(score) FOR curse_name IN (语文,数学)) AS P

不过这不是最完整的解决方案,假设你添加多了几门课程,例如英语,化学,生物之类的,就要在原来的语句里添加相应的项,所以要用动态SQL来实现,方法就是先把score表里的全部课程GROUP BY 出来,生成字符串形式(如‘语文,数学,英语,化学,生物’),用逗号隔开,插入到上面语句的PIVOT表达式的IN中,实现如下:
DECLARE @sql NVARCHAR(MAX)
DECLARE @curseList NVARCHAR(200)

SET @curseList=STUFF(
(SELECT \',\'+curse_name FROM score GROUP BY curse_name FOR XML PATH(\'\')),1,1,\'\')

SET @sql=\'
SELECT * FROM (
SELECT student_id,name AS sdudent_name,curse_name,score FROM student st JOIN score sc ON st.id=sc.student_id) AS T
PIVOT(SUM(score) FOR curse_name IN (\'+@curseList+\')) AS P\'

EXEC(@sql)
参考技术A 这种可以用数据透视表来解决!
select a.id as student_id,a.name as student_name, ( case b.curse_name when ' 语文成绩 ' then score else 0 end ) as 语文成绩 , ( case b.curse_name when ' 数学成绩' then score else 0 end ) as 数学成绩 from student as a join score as b on a.id=b. student_id group by a.name

以上是关于SQL Server数据库多表关联如何更新?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 关联表批量更新多行

SQl update 多表关联 问题

如何在sqlserver建立新用户并关联相应的数据库

数据库MySQL中关于“多表关联更新”的那些事

Sql Server多表查询

SQL Server 2008 update语句只能更新1行数据?