我有两个表用户和地址
用户表架构
user_id
name
address_id
sent
地址表架构
address_id
create_date
location
user_id
我有这个返回16行的查询
select * from users where sent = 1;
但所有address_id都是NULL,因为它们尚未创建
所以我需要做的是在地址表中创建16行,每个用户使用user_id创建一行,然后在该地址的users表中设置address_id
现在我可以将位置字段留空。我需要做的就是将create_date设置为CURRENT_DATE
有没有办法在一个查询中执行此操作?
答案 0 :(得分:2)
不完全确定你的意思,但这至少应该指向正确的方向
Begin Try
Begin Transaction
Update Users
Set Users.address = Address.address, create_date = GetDate()
From Addresses
Inner Join Users On Addresses.userid = Users.userid
Commit Transaction
End Try
Begin Catch
Rollback Transaction
End Catch
它应该是这样的。有几种方法可以解决这个问题,所以玩得很开心,希望这会有所帮助。为了进行测试,它会在前一个和后一个之后写两个Select * From Users
语句。同时将Commit Transaction
更改为Rollback Transaction
,这样您就不必担心会犯错误。
重新阅读问题是的,你不能一次性做到这一点只需用
替换Update
语句
Insert Into Addresses (address_id, create_date, location, user_id)
Values ('@ddr355_1d', GetDate(), '1234theLocation', 123478)
并且您必须为每个人执行此操作,但在User表中只有16个条目应该很容易。如果您计划向表中添加更多内容,则可能需要考虑编写存储过程。有点像这样的
Create Procedure [dbo].[AddressesInsertData]
(
@Address Int,
@Location varchar(100),
@UserId Int
)
As
Begin Try
Begin Transaction
Insert Into Addresses (address_id, create_date, location, user_id)
Values (@Address, GetDate(), @Location, @UserId)
Commit Transaction
End Try
Begin Catch
Rollback Transaction
End Catch
存储过程的基本结构。我会在那里添加一个if not exists
来更新而不是插入,但这应该足以让你开始。希望这些例子可以为你清理一些事情并帮助你。
答案 1 :(得分:2)
试试这个:
declare @user table(user_id [int] IDENTITY(1,1), name varchar(25), address_id int, sent int)
declare @address table(address_id [int] IDENTITY(1,1) NOT NULL, create_date datetime default getdate(), location varchar(100), user_id int)
declare @t table(user_id int, address_id int)
insert @user (name) values('you')
insert @user (name) values('someone else')
begin Transaction
insert @address (user_id)
output inserted.user_id, inserted.address_id
into @t
select user_id from @user u
where not exists (select 1 from @address where u.user_id = user_id)
update u
set u.address_id = t.address_id
from @user u
join @t t
on u.user_id = t.user_id
commit transaction
select * from @user
select * from @address
答案 2 :(得分:1)
您不能在一个声明中执行此操作,您可以在一个事务中执行此操作。见similar question
答案 3 :(得分:0)
有一个设计经验法则,一个表模拟实体/类或实体/类之间的关系,但不是两者。
因此,我建议您从users表中删除address_id
列,从地址表中删除user_id
并创建包含user_id
和address_id
的第三个表格模拟用户与其地址之间的关系。这也将使您无需拥有可为空的列。