系列

时间:2016-10-17 09:48:04

标签: sql sql-server

我想创建一个从字段中获取值的查询,并在兄弟记录中更新它。

对于上下文,我有一个带有子表(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

2 个答案:

答案 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';