2013-08-12 108 views
1

我想知道是否有可能加入我們創建的同一張表,而不必在連接後複製整個表代碼。我們可以加入我們在sql中創建的同一個表嗎?

例如:

create table tableC as 
select * 
from (
    select *, min(a) as minA 
    from tableB 
    group by id) as tb0 
) 
join (select *, min(a) as minA 
    from tableB 
    where min(a) = 1) as tb1 
on tb1.id = tb0.id; 

在這個例子中,在沒有必要加入了,不過,在某些情況下,它是。 我的問題是我們可以使用第一個代碼塊中的表來執行連接,而不必在連接之後複製整個代碼?

更準確地說,我們可以這樣做

create table tableC as 
select * 
from (
    select *, min(a) as minA 
    from tableB 
    group by id) as tb0 
) 
join (select * 
    from **tb0** 
    where **minA** = 1) as tb1 
on tb1.id = tb0.id; 

感謝

+0

不知道你在這裏問什麼。你創建'tableC',但是你從'tableB'中選擇。這很好。 –

+0

我想使用表tb0來執行連接,但不必再次創建tb0。我會稍微修改我的代碼 – DJJ

回答

2

好了,乾淨,簡單的方法是創建一個視圖:

proc sql noprint; 
    create view myView as 
    select *, min(a) as minA 
    from tableB 
    group by id; 
quit; 

proc sql noprint; 
    select * 
    from myView as tb0 
    join 
    (
     select * 
     from myView 
     where minA=1 
    ) as tb1 
    on tb1.id=tb2.id; 
quit; 

它的工作原理(如果我沒有輸入錯字),它可以防止代碼重複,並且看起來更乾淨。 (後者是當然的個人意見)

我想知道你想象什麼情況下,這個特定的連接是有用的。

+0

我期望別的東西,但是這個視圖是一個非常有趣的選擇。爲了回答你的問題,我有很多變量需要創建,我需要這些變量來組成其他變量。這讓我無需製作比我需要的桌子更多的桌子。非常感謝 – DJJ

+0

只要聚合級別相同,您可以在同一步驟中對正在創建的變量執行功能。例如'創建表格測試作爲選擇日期,銷售額,價格,銷售額*價格作爲收入,計算出的收入/成本作爲源自newvar'; – scott

+0

@DJJ在SAS中,如果您真的必須這樣做, 。從你的用例中可以看出,這聽起來並不需要,但你必須進一步解釋。 – Joe

1

在SAS中,您不能直接執行該功能。在將使用with塊執行的TSQL中,但SAS(當前)不支持該功能。這看起來大致如下:

with tb0 as (
    select *, min(a) as minA 
    from tableB 
    group by id) 
select * from tb0 
inner join 
(select 1 from tb0 where min(something)) tb1 
    on tb0.id=tb1.id; 
相關問題