2015-11-04 57 views
0

*注意:這與「可能的重複」不一樣。在這裏,對於在SELECT語句中返回的每個記錄,表名將是不同的。所以我不能「設置」像set @tableName = 'whatever'這樣的變量。如何在連接中使用select語句中返回的表名?

這是我的SQL - 看看我最後的內部連接。表中的e.Name EmailSendDefintion是我需要加入的表的名稱。所以,這是一種動態的,我知道,但我如何加入存儲在另一個表中的字段中的表?

select top 5000 
    x.HL_ACCT_ID as 'HL_ACCT_ID', 
    x.SALE_CODE as 'SALE_CODE', 
    s.SubscriberKey as 'EmailAddress', 
    o.EventDate as 'Opened', 
    c.EventDate as 'Clicked', 
    b.EventDate as 'Bounced' 
    from c100._sent s with (nolock) 
    inner join c100._job j with (nolock) on s.jobid = j.jobid 
    inner join emailsenddefinition e with (nolock) on e.customerkey = j.emailsenddefinition 
    left join c100._open o with (nolock) on o.jobid = s.jobid and o.subscriberkey = s.subscriberkey 
    left join c100._click c with (nolock) on c.jobid = s.jobid and c.subscriberkey = s.subscriberkey 
    left join c100._bounce b with (nolock) on b.jobid = s.jobid and b.subscriberkey = s.subscriberkey 
inner join c100.[e.name] x with (nolock) on x.EmailAddress = s.SubscriberKey 
    where e.clientid = 100 
+0

的可能的複製[如何創建內部CURSOR動態SQL查詢(http://stackoverflow.com/questions/16394720/how -to-create-dynamic-sql-queries-cursor-cursor) –

+0

我是seconding @Juan。你想要的東西好像是一個動態的sql來填充一個sql命令數組,然後執行它。 –

回答

0

你有幾張桌子?如果沒有太多的一個選項是左連接所有這些

left join c100.table1 x1 on x1.EmailAddress = s.SubscriberKey and [e.name] = 'table1' 
left join c100.table2 x1 on x2.EmailAddress = s.SubscriberKey and [e.name] = 'table2' 
etc... 

,然後在選擇

coalesce(x1.HL_ACCT_ID, x2.HL_ACCT_ID, etc...) as 'HL_ACCT_ID', 
1

也許你可以只創建一個輸出的所有e.name表的union一個看法?然後加入視圖。

爲了保持這一點,假設您只有兩個不同的表,其名稱可能在e.name列中,SubscriberEmail1SubscriberEmail2

然後,你可以創建這樣一個觀點:

CREATE VIEW SubscriberEmailUnion 
AS 
    SELECT 
     'SubscriberEmail1' as TableName, 
     HL_ACCT_ID, 
     SALE_CODE, 
     EmailAddress 
    FROM SubscriberEmail1 

    UNION 

    SELECT 
     'SubscriberEmail2' as TableName, 
     HL_ACCT_ID, 
     SALE_CODE, 
     EmailAddress 
    FROM SubscriberEmail2 
GO 

注意的是,鑑於各部分是增加的名字是基礎表的列。然後,您可以更改您的最終加入到:

inner join SubscriberEmailUnion x with (nolock) on (
    x.EmailAddress = s.SubscriberKey 
    AND x.TableName = e.Name 
) 

我個人最熟悉MS Sql Server所以我的示例使用語法。如果有必要,應該很容易改變以使用不同的服務器。

出於性能,那麼你可以使用任何功能,您的數據庫有,索引視圖等