我如何使用SQL Server执行此操作?

时间:2011-09-14 13:52:15

标签: sql sql-server insert

我有两个表用户和地址

用户表架构

 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

有没有办法在一个查询中执行此操作?

4 个答案:

答案 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_idaddress_id的第三个表格模拟用户与其地址之间的关系。这也将使您无需拥有可为空的列。