Sql server MSSQL查询错误
我想从两个表中访问数据,其中数据是按小时计算的。我正在使用UNIONQUERY处理这个问题,如下所示Sql server MSSQL查询错误,sql-server,sql-server-2008,stored-procedures,Sql Server,Sql Server 2008,Stored Procedures,我想从两个表中访问数据,其中数据是按小时计算的。我正在使用UNIONQUERY处理这个问题,如下所示 ( SELECT T.unit1,t.CurrentDate,t.CurrentTime,loc,Unit2,value,Description FROM fore T WHERE loc=@loc AND CurrentDateTIME =@c0 AND quan='CO' AND NOT EXISTS( SELECT 1 FROM audit WHERE startdate<
( SELECT T.unit1,t.CurrentDate,t.CurrentTime,loc,Unit2,value,Description FROM fore T WHERE loc=@loc AND CurrentDateTIME =@c0 AND quan='CO'
AND NOT EXISTS( SELECT 1 FROM audit WHERE startdate<=CAST(@c0dt AS DATE) AND StartTime<=CAST(@c0dt AS TIME) AND (ENDDATE >= CAST(@c0dt AS DATE) OR EndDate IS NULL )
AND (ENDTIME>=CAST(@c0dt AS TIME) OR enDtime IS NULL ) AND loc=@loc AND unit1='CO')
UNION
SELECT TOP 1 T.unit1,t.CurrentDate,t.CurrentTime,loc,'' as Unit2 ,CAST(VALUE AS SMALLINT) value ,Description FROM audit T WHERE startdate<=CAST(getdate() AS DATE)
AND StartTime <= CAST(CURRENT_TIMESTAMP AS TIME)AND (enddate>=getdate() OR ENDDATE IS NOT NULL ) AND (endTime>=CAST(GETDATE() AS TIME) OR enDtime IS NULL)
AND loc=@loc AND unit1='CO')
表3:
currentdate currenttime loc unit1 unit2 concern value description currentdatetime
2015-08-19 15:00:00 B1 C0 m .1700 5 Good 2015-08-19 15:00:00.000
2015-08-19 16:00:00 B1 C0 m 14.7000 35 Good 2015-08-19 16:00:00.000
2015-08-19 17:00:00 B1 C0 m 6.5600 7 Good 2015-08-19 17:00:00.000
2015-08-19 19:00:00 B1 C0 m 19.6000 20 Good 2015-08-19 19:00:00.000
以上两个表的说明如下:表中:Fore由小时转储数据组成,表中:audit由用户修改日期组成,如果该小时的数据不可用,则用户手动输入数据
我想写一个union,它应该以我从前端得到的c0dt@c0dt datetime获取数据。所以问题是,当我运行上述查询时,我无法从手动输入的审计表中获取数据。使用这些数据和查询,我认为您不会得到任何结果。在开始日期之前有一个结束日期
PS:您有一个独特的设计,为同一事物冗余了日期、时间和日期时间字段。只是好奇这是否有效:我记得在某个地方读到,与TOP的联合在MSSQL中不起作用。。。我在找那篇文章。认为它与top工作所需的order by有关,但order by只能在两个数据集的并集上定义。。。一种解决方法是使用CTE或内联视图。。。这就是为什么我问这个CTE例子是否有效
WITH A AS ( SELECT
T.unit1
,t.CurrentDate
,t.CurrentTime
,loc
,Unit2
,value
,Description
FROM fore T
WHERE loc=@loc
AND CurrentDateTIME =@c0
AND quan='CO'
AND NOT EXISTS( SELECT 1
FROM audit
WHERE startdate<=CAST(@c0dt AS DATE)
AND StartTime<=CAST(@c0dt AS TIME)
AND (ENDDATE >= CAST(@c0dt AS DATE)
OR EndDate IS NULL )
AND (ENDTIME>=CAST(@c0dt AS TIME)
OR enDtime IS NULL )
AND loc=@loc
AND unit1='CO'),
B as (SELECT TOP 1
T.unit1
,t.CurrentDate
,t.CurrentTime
,loc
,'' as Unit2
,CAST(VALUE AS SMALLINT) value
,Description
FROM audit T
WHERE startdate<=CAST(getdate() AS DATE)
AND StartTime <= CAST(CURRENT_TIMESTAMP AS TIME)
AND (enddate>=getdate()
OR ENDDATE IS NOT NULL )
AND (endTime>=CAST(GETDATE() AS TIME)
OR enDtime IS NULL)
AND loc=@loc
AND unit1='CO'))
SELECT * from A
UNION ALL
SELECT * FROM B;
你能举一个你得到的输出的例子吗?添加了我得到的和我需要的输出多么有意义的标题!我看到你已经编辑了你的问题。我不明白你怎么会用这个问题得到这样的结果。您的数据与此处显示的数据不同,或者您正在使用不同的查询。数据相同,查询也相同。在本例中,审核表从前端应用程序获取数据,并以此格式保存日期。
WITH A AS ( SELECT
T.unit1
,t.CurrentDate
,t.CurrentTime
,loc
,Unit2
,value
,Description
FROM fore T
WHERE loc=@loc
AND CurrentDateTIME =@c0
AND quan='CO'
AND NOT EXISTS( SELECT 1
FROM audit
WHERE startdate<=CAST(@c0dt AS DATE)
AND StartTime<=CAST(@c0dt AS TIME)
AND (ENDDATE >= CAST(@c0dt AS DATE)
OR EndDate IS NULL )
AND (ENDTIME>=CAST(@c0dt AS TIME)
OR enDtime IS NULL )
AND loc=@loc
AND unit1='CO'),
B as (SELECT TOP 1
T.unit1
,t.CurrentDate
,t.CurrentTime
,loc
,'' as Unit2
,CAST(VALUE AS SMALLINT) value
,Description
FROM audit T
WHERE startdate<=CAST(getdate() AS DATE)
AND StartTime <= CAST(CURRENT_TIMESTAMP AS TIME)
AND (enddate>=getdate()
OR ENDDATE IS NOT NULL )
AND (endTime>=CAST(GETDATE() AS TIME)
OR enDtime IS NULL)
AND loc=@loc
AND unit1='CO'))
SELECT * from A
UNION ALL
SELECT * FROM B;