0

我通过引用两个同义词创建了一个视图。我要收获我的视图表的当前查询如下

SELECT  dbo.synonym1.JobNo
      , dbo.synonym1.Customer
      , dbo.synonym2.PostalService
      , dbo.synonym2.FirstDate
      , dbo.synonym2.SecondDate
FROM dbo.synonym1 
  INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo
WHERE dbo.synonym2.PostalService = 'UPS'

现在我想找到每一行和dbo.synonym2.FirstDate同一行之间的差异,只要有差异就可以多次进入视图表。dbo.synonym2.SecondDateINSERT

例如,如果FirstDateis2012-06-03 00:00:00.000SecondDateis2012-06-05 00:00:00.000那么它应该插入同一行两次。

我正在使用 SQL Server 2008 R2,我是 SQL 的新手。请帮帮我

当前在视图中使用上述查询填充的示例数据如下,

JobNo  Customer PostalService FirstDate                 SecondDate  
1      ABC      UPS           2012-06-03 00:00:00.000   2012-06-03 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000

我需要如下结果

JobNo  Customer PostalService FirstDate                 SecondDate  
1      ABC      UPS           2012-06-03 00:00:00.000   2012-06-03 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
2      DEF      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
2      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-05 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000
3      XYZ      UPS           2012-06-03 00:00:00.000   2012-06-06 00:00:00.000

如果您看到 JobNo 2 的日期之间的差异为 3,则数据将重复 3 次。JobNo 3 为 2,因此数据重复两次。

4

3 回答 3

1

您的请求有点令人困惑,因为通常不会插入视图。

但是,以下内容会将行插入表中

insert into ViewTable(JobNo, Customer, PostalService, FirstDate, SecondDate)
    SELECT dbo.synonym1.JobNo, dbo.synonym1.Customer, dbo.synonym2.PostalService,
           dbo.synonym2.FirstDate, dbo.synonym2.SecondDate
     FROM dbo.synonym1 INNER JOIN
          dbo.synonym2
          ON dbo.synonym1.JobNo = sbo.synonym2.JobNo
     WHERE dbo.synonym2.PostalService = 'UPS' and
           datediff(d, FirstDate, SecondDate) <> 0

不过,您需要将 ViewTable 定义为实际表。

于 2012-06-05T16:12:07.567 回答
0

听起来你想要的是下面的联合语句来填充这个临时表。除非我误解了你的要求。

DECLARE @MyTable as TABLE(JobNo VARHCAR(50), Customer VARCHAR(50), 
                       Postalservice VARCHAR(50), MyDate DateTime)

INSERT into @MyTable 
SELECT  dbo.synonym1.JobNo 
  , dbo.synonym1.Customer 
  , dbo.synonym2.PostalService 
  , dbo.synonym2.FirstDate 

FROM dbo.synonym1  
INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo 
WHERE dbo.synonym2.PostalService = 'UPS'  
UNION
SELECT  dbo.synonym1.JobNo 
  , dbo.synonym1.Customer 
  , dbo.synonym2.PostalService 

  , dbo.synonym2.SecondDate 
FROM dbo.synonym1  
INNER JOIN dbo.synonym2 ON dbo.synonym1.JobNo = sbo.synonym2.JobNo 
WHERE dbo.synonym2.PostalService = 'UPS'     

从@MyTable 插入您的视图

于 2012-06-05T16:07:05.257 回答
0
Create Table #temp
(
    StartDate DateTime,
    EndDate DateTime
)

Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-03 00:00:00.000');
Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-06 00:00:00.000');
Insert into #temp(StartDate, EndDate)
                    Values('2012-06-03 00:00:00.000', '2012-06-05 00:00:00.000');

With DateRange As
(
    select Convert(DateTime, '2012-06-02 00:00:00.000') as StartDate, 
          DATEADD(dd, 1, Convert(DateTime, '2012-06-02 00:00:00.000')) as EndDate
    Union All
    select EndDate, DATEADD(dd, 1, EndDate) From DateRange 
                    Where EndDate <= Convert(DateTime, '2012-06-10 00:00:00.000')
)

Select T.* from #temp T
Left Join DateRange R on ((T.StartDate < R.EndDate and T.EndDate > R.StartDate) 
          or (T.StartDate = R.EndDate and T.EndDate = R.StartDate))
order  by T.EndDate

Drop table #temp
于 2012-06-05T16:20:51.520 回答