0

次のクエリがあります。

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'

その後、ビューから取得できます。

さて、以下と同様に行う方法がわかりません。その場合、上記と同様にクロス結合する必要があります。

実際の日付がどのように複雑であるかに注目してください。上記と同様にクロステーブルを使用する必要がありますが、ご覧のとおりではなく、やや複雑です。

(この部分の注意として、上記のビュー 1 に 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'

その後、ビューから取得できます。

4

1 に答える 1

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 に追加し、@PID を p.pid に置き換えただけです。結果は、外部レベルのテーブルへの参照を含むサブクエリです。このようなサブクエリは、相関サブクエリと呼ばれます。

于 2012-08-10T13:53:17.350 に答える