重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
update 表C
我们提供的服务有:网站制作、网站建设、微信公众号开发、网站优化、网站认证、南票ssl等。为1000多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的南票网站制作公司
set 表C.c3=表B.b3
from 表C
where 表C.c1=表A.a2 and 表C.c2=表B.b2
您说的还没搞明白,从语法上讲应该是这样的,不知道行不行,只做过2个表之间关联更新的,您这个要3个表,而且B表和 C表的关联有没有呢?
关联两个表的方式包含内连接,外连接(左外连接,右外连接),交叉连接。
参考语句:
内连接
select * from student a
inner join stuMarks b
on a.stuid=b.stuid
外连接
select * from student a
inner join stuMarks b
on a.stuid=b.stuid
交叉连接
select * from student a
crossjoin stuMarks b
select c.discount
from a,b,c where a.hw_name=b.hw_name
and b.sort_id=c.sort_id
and a.hw_name='苹果'
select * from A inner join B
on A.aa = B.aa
inner join c on A.aa = C.aa
where A.cc = '1'
union
select * from A inner join B
on A.aa = B.aa
inner join d on A.aa = d.aa
where A.cc = '2'
union
select * from A inner join B
on A.aa = B.aa
inner join e on A.aa = e.aa
where A.cc = '3'
CREATE TRIGGER [dbo].[表1_UPDATE_表2] --这里是触发器名称,最好一目了然的
ON [dbo].[表1]
FOR UPDATE,INSERT,DELETE --更新,插入,删除时触发(根据实际情况,可以只用一个)
AS
BEGIN
--下面是你的语句,我没有修改,只是调整了排版和大小写
UPDATE 表2
SET name=0,age=''
FROM 表2 INNER JOIN
(
SELECT DISTINCT ABS(id) AS billid,sale_z.ele_sordercode
FROM 表3
WHERE ele_sordercode''
) 表3
ON 表2.tid=表3.id LEFT JOIN
(
SELECT MAX(id) AS id, referbillid
FROM 表1
WHERE referbillid0
GROUP BY referbillid
) 表1 ON 表3.id=表1.id
WHERE name=1 AND refer.id IS NULL
END
外键是用来实现“引用完整性”的,说白了就是一种约束,不能用来传值。
可以选择触发器或存储过程。
如果两个表字段相同可以用触发器:
CREATE TRIGGER trigger_AToB on A
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO A(a,b,c) SELECT a,b,c FROM inserted
INSERT INTO B(a,b,c) SELECT a,b,c FROM inserted
END
GO
INSERT INTO a(a,b,c)VALUES('aaa','aaa','aaa')
在查询分析器里执行上面的语句后,向A表添加数据会同时向B表添加。触发器比较方便,缺点是,一旦B表被删除了,向A表添加数据会报错。
存储过程就比较自由了:
CREATE PROC proc_InsertAToB
@a VARCHAR(10),
@b VARCHAR(20),
@c VARCHAR(30)
as
INSERT INTO A(a,b,c)VALUES(@a,@b,@c)
INSERT INTO B(a,b,c)VALUES(@a,@b,@c)
表B的字段和表A不一样也没关系,需要的话,可以再根据需要向存储过程添加参数。
使用的时候不再用INSERT INTO了,用:
EXECUTE proc_InsertAToB 'aaa','aaa','aaa'就可以。