SQL在子查询中从2个表中插入多行

时间:2014-01-13 11:06:42

标签: sql sql-server-2008

我正在尝试更新SQL数据库中的一些预算数据。我有一个表,这是今年的数据集,另一个表包含去年(我需要将这些年数据插入)。 在插入期间,我需要为临时表中的每个站点编号创建一个唯一的行,针对每个站点编号需要是今年的信息(周编号,开始日期,结束日期等)。 我已经尝试使用子查询(但显然这会失败,因为获取站点号的子查询将返回多个记录。所以我正在尝试cursor,但是虽然它没有错误,但它没有插入任何约会。如果有人有任何想法,那将是伟大的。 这是我的cursor code

create table #tempSiteNoTable (SiteNo int)
insert into #tempSiteNoTable
Select distinct(SiteNumber)
from Lynx_Period_Lookup

    begin tran xxx
    Declare @SiteNNo int

    Declare SiteNumberCursor Cursor FOR
        Select 
            SiteNo from #tempSiteNoTable where SiteNo = @SiteNNo
        Open SiteNumberCursor
    Fetch next from SiteNumberCursor
    Into @SiteNNo while @@fetch_status = 0

    begin
        insert into Lynx_Period_Lookup
          (SiteNumber,SubPeriod,StartDate,EndDate,[Year],Period,[Week],BusinessCalendarNumber,BusinessCalendarName)
          Select
            @SiteNNo,
            SubPeriod,
            StartDate,
            EndDate,
            2014 as year,
            Period,
            WeekNo,
            BusinessCalendarNumber,
           BusinessCalendarName
            from accountingperiods
           Fetch next from SiteNumberCursor
           into @SiteNNo

    End
        Close SiteNumberCursor
    Deallocate SiteNumberCursor

2 个答案:

答案 0 :(得分:0)

你应该能够没有游标 - 而且非常容易!

试试这个:

CREATE TABLE #tempSiteNoTable (SiteNo int)

INSERT INTO #tempSiteNoTable(SiteNo)
   SELECT DISTINCT (SiteNumber)
   FROM dbo.Lynx_Period_Lookup

INSERT INTO dbo.Lynx_Period_Lookup(SiteNumber, SubPeriod, StartDate, EndDate, [Year], Period, [Week], BusinessCalendarNumber, BusinessCalendarName)
    SELECT
        t.SiteNo,
        ap.SubPeriod,
        ap.StartDate,
        ap.EndDate,
        2014 as year,
        ap.Period,
        ap.WeekNo,
        ap.BusinessCalendarNumber,
        ap.BusinessCalendarName
    FROM
        #tempSiteNoTable t
    INNER JOIN
        dbo.AccountingPeriods ap ON ... (how are those two sets of data related?)...

我不知道的唯一一点 - AccountingPeriods#tempSiteNoTable如何相关 - 他们共享哪些共同专栏?

这就是它的全部 - 没有游标,没有乱搞逐行激动行(RBAR)处理 - 只有一个,漂亮,干净基于集合

答案 1 :(得分:0)

我认为你正在寻找一个CROSS JOIN;尝试下面的代码片段。

DECLARE @Table1 TABLE (Week int, StartDate datetime)
DECLARE @Table2 TABLE (sitenumber int)

INSERT INTO @Table1 (Week, StartDate)
VALUES (1, '2014-01-01'), (2, '2014-01-08')

INSERT INTO @Table2 (sitenumber)
VALUES (1), (2)

SELECT *
FROM @Table1 CROSS JOIN @Table2