我想创建一个从字段中获取值的查询,并在兄弟记录中更新它。
对于上下文,我有一个带有子表(quote)的sales表(salesID主键),它有一个quoteID主键和一个sales ID外键。我希望创建一个查询,从第一个引用记录的子表中选择salespersonname字段,并将此字段更新为所有子记录。
这可能吗?我已经尝试了以下没有运气。
update quotes
set salespersonname= x.salespersonname from
(select salespersonname from quotes Inner Join sales on quotesalesID = salesID
where quoteID = '1') as x
示例数据
Sales table
SalesID
1
2
Quote Table
QuoteID SalesID SalesPersonname
1 2 Jim
2 2 Sarah
4 1 Bob
3 2 Null
预期结果 SalesID 1 2
Quote Table
QuoteID SalesID SalesPersonname
1 2 Jim
2 2 Jim
4 1 Bob
3 2 Jim
答案 0 :(得分:1)
编辑: 仍然不确定业务逻辑,但这是我认为你想要做的事情:
CTE将获得每个SalesID的“第一条”记录。通常这会有一些像日期这样的业务逻辑,但我会使用最低的QuoteID。
示例数据:
Create Table #Quotes (QuoteID Int, QuoteSalesID Int, SalesPersonName Varchar(100))
Insert #Quotes Values (1, 2, 'Jim')
Insert #Quotes Values (2, 2, 'Sarah')
Insert #Quotes Values (4, 1, 'Bob')
Insert #Quotes Values (3, 2, Null)
;
With cteGetLowestQuoteID AS
(
Select QuoteSalesID, SalesPersonName,
Row_Number() Over (Partition By QuoteSalesID Order By QuoteID) RowNum
From #Quotes
)
Update Q Set Q.SalesPersonName = C.SalesPersonName
From #Quotes Q
Join cteGetLowestQuoteID C On C.QuoteSalesID = Q.QuoteSalesID
Where C.RowNum = 1
Select * From #Quotes
编辑前:
你的问题对我来说没有意义。在旁注中,salespersonname确实不属于报价表,除非销售是您的销售员表,否则它也不属于那里。
在我看来,这是如何最好地呈现样本数据。代码已准备好运行。
-- Drop Table #Sales Drop Table #Quotes
Create Table #Sales (SalesID Int, SalesPersonName Varchar(100))
Create Table #Quotes (QuoteID Int, QuoteSalesID Int, SalesPersonName Varchar(100))
Insert #Sales Values (1, 'John')
Insert #Sales Values (2, 'Joe')
Insert #Quotes Values (1, 2, 'Jim')
Insert #Quotes Values (2, 2, 'Sarah')
Insert #Quotes Values (3, 2, Null)
Select *
From #Sales S
Join #Quotes Q On Q.QuoteSalesID = S.SalesID
这提供:
SalesID SalesPersonName QuoteID QuoteSalesID SalesPersonName
2 Joe 1 2 Jim
2 Joe 2 2 Sarah
2 Joe 3 2 NULL
你说你希望将记录更新为Jim,这就是我感到困惑的地方。我猜你要更新报价记录,让Joe作为销售人员名称,基于2的外键。如果我弄错了,这里的查询可以帮助你达到你需要的。
我在你的查询中修改了一些拼写错误并运行了这个:
Update #Quotes
Set SalesPersonName= x.salespersonname
From
(Select Q.Salespersonname
From #Quotes Q
Inner Join #Sales S On QuoteSalesID = SalesID
Where QuoteID = '1') As x
Select *
From #Sales S
Join #Quotes Q On Q.QuoteSalesID = S.SalesID
这产生了:
SalesID SalesPersonName QuoteID QuoteSalesID SalesPersonName
2 Joe 1 2 Jim
2 Joe 2 2 Jim
2 Joe 3 2 Jim
这是吉姆不是乔。再次这就是为什么我感到困惑,即使我不理解其背后的业务逻辑,您的查询也适用于您所声明的目标。我从未见过以你的方式使用的更新。我就是这样写的:
Update Q
Set Q.SalesPersonName= S.salespersonname
From #Quotes Q
Inner Join #Sales S On QuoteSalesID = SalesID
Select *
From #Sales S
Join #Quotes Q On Q.QuoteSalesID = S.SalesID
这会在所有三条记录中将名称更新为Joe。
答案 1 :(得分:0)
我不确定如果我理解你的问题,但根据你的查询,我建议你提出以下问题:
UPDATE
Q
SET
salespersonname = x.salespersonname
FROM
quotes Q
INNER JOIN sales x
ON quotesalesID = salesID
WHERE
quoteID = '1';