2012-08-10 74 views
0

我有以下查询:的SQL Server交叉联接

select 
    tt.ItemOrder, tt.DisplayVal as Task, tt.Responsible as ResParty, 
    tt.DaysDue, 
    ActualDate = (select convert(varchar(10), cnfmdate, 101) from ProSer where PId = @PID), PDate = @PDate 
from 
    tblTimeline tt 
where 
    tt.ID = 1 

我需要做的就是把它放在一个观点,这样我可以调用简单地使用PID的看法。 我想出了以下内容并使用交叉连接:

create view view1 as 
    select 
     ps.PID, tt.ID, tt.ItemOrder, tt.DisplayVal as Task, 
     tt.Responsible as ResParty, tt.DaysDue, 
     ps.cnfmdate As ActualDate, ProgStartDate as ProgramDate 
    from 
     tblTimeline tt 
    cross join 
     ProSer ps 
    where 
     tt.ID = 1 and ps.cancelled = 0 

注意,现在,我可以做以下

select * 
from view1 
where PID = '34343' 

,然后我可以从视图中检索。

现在,我不知道如何做到与以下情况类似,在这种情况下,我需要将它与交叉连接放在一起,类似于上面的操作。

请注意实际日期是如何涉及更多的一些。我需要使用交叉表,类似于上面的操作,但不像您所看到的那样,它涉及更多。

(注意这个部分,我将simly加入到我与UNION上面有厂景

select 
    tt.ItemOrder, tt.DisplayVal as Task, tt.Responsible as ResParty, 
    ActualDate = (
      CASE 
      WHEN 
      NOT EXISTS(SELECT * FROM Spls WHERE RequestRcvd = 1 AND PID = @PID) 
      THEN 
      'N/A'  
      WHEN EXISTS (SELECT * FROM spls WHERE RequestRcvd = 1 AND RequestRcvdDate IS NOT NULL) 
      THEN 
      (SELECT CONVERT(VARCHAR(10),MAX(RequestRcvdDate),101) from spls WHERE RequestRcvd = 1 AND PID = @PID) 
      END 
     ) 
from 
    tblTimeline tt 
where 
    tt.ID = 9 

我需要知道我可以创建这个在交叉连接(这将是一个内部视图),这样我可以做类似下面的如何,我做了一个以上

select * 
from view1 
where PID = '34343' 

,然后我可以从视图中检索。

+0

proser是否包含您想要查询的PID? – 2012-08-10 13:36:45

+0

是的,proser确实包含PID – 2012-08-10 13:40:11

回答

0

有可能是简化查询的方式,但以下应该工作:

select p.pid, tt.ItemOrder, tt.DisplayVal as Task, 
     tt.Responsible as ResParty, 
     ActualDate = (CASE WHEN NOT EXISTS(SELECT * FROM Spls WHERE RequestRcvd = 1 AND spls.PID = p.PID) 
          THEN 'N/A' 
          WHEN EXISTS (SELECT * FROM spls WHERE RequestRcvd = 1 AND RequestRcvdDate IS NOT NULL) 
          THEN (SELECT CONVERT(VARCHAR(10),MAX(RequestRcvdDate),101) from spls WHERE RequestRcvd = 1 AND spls.PID = p.PID) 
        END) 
from tblTimeline tt cross join 
    poser p 
where tt.ID = 9 

我所做的只是将交叉连接添加到poser并用p.pid替换@PID。结果是包含对外部表的引用的子查询。这种子查询称为相关子查询。