2011-04-06 63 views
4

使用SQL Server 2005,在以下情況下加入兩個表的最有效方法是什麼?SQL Server 2005 - 根據表列中的條件進行連接

每個表格中的記錄數量可能相當大,約爲200000個。

我現在唯一想到這樣做的唯一方法是對每個項目使用遊標和一些動態SQL,這顯然會非常低效。

我有兩個表 - PERSON表和SEARCHITEMS表。 SEARCHITEMS表包含一個列,其中包含一些簡單條件,將表與PERSON表匹配時將使用該列。該條件可引用PERSON表中的任何列。

例如給出如下表:

PERSON

PERSONID FIRSTNAME LASTNAME GENDER AGE ... VARIOUS OTHER COLUMNS 
1   Fred  Bloggs M  16 
.... 
200000  Steve  Smith M  18 

SEARCHITEMS

ITEMID   DESCRIPTION  SEARCHCRITERIA 
1    Males   GENDER = 'M' 
2    Aged 16   AGE=16 
3    Some Statistic {OTHERCOLUMN >= SOMEVALUE AND OTHERCOLUMN < SOMEVALUE} 
.... 
200000   Males Aged 16 GENDER = 'M' AND AGE = 16 

RESULTS表應包含這樣的事情:

ITEMID   DESCRIPTION  PERSONID LASTNAME 

1    Males    1   Bloggs 
1    Males    200000  Smith 
2    Aged 16   1   Bloggs 
.... 
200000   Males Aged 16  1   Bloggs 

這將是很好能夠只是像做

INSERT INTO RESULTSTABLE 
    SELECT * 
    FROM PERSON P 
    LEFT JOIN SEARCHITEMS SI ON (APPLY SI.SEARCHCRITERIA TO P) 

,但我看不到使這項工作的一種方式。任何幫助或想法表示讚賞。

+0

你試圖完全解決什麼問題?僅僅是加入這兩張表的要求? – Ali 2011-04-06 10:50:32

+0

要求是將任何匹配記錄的結果插入到結果表中 - 它不一定需要使用它只需要有效的連接 - 如果可以實現,我發現連接最終效率最高。 – 2011-04-06 11:09:21

+0

我認爲我們應該在人員和搜索項目之間建立一箇中間表格,因爲結果表格的大小與當前描述的大小不符,我曾考慮過這個問題,除非您知道所有搜索條件組合(我非常懷疑),否則我無法想出使用遊標的更好解決方案。 – Ali 2011-04-06 11:21:16

回答

-1

您可以動態構建您的TSQL,然後使用sp_executesql執行它。

5

看到SEARCHITEMS表本質上是非關係型的,似乎光標和動態SQL解決方案是唯一可行的解​​決方案。當然這會很慢,我會「預先計算」結果,使它有點可以承受。

爲此創建下表:

CREATE TABLE MATCHEDITEMS(
    ITEMID int NOT NULL 
     CONSTRAINT fkMatchedSearchItem 
     FOREIGN KEY 
     REFERENCES SEARCHITEMS(ITEMID), 
    PERSONID int 
     CONSTRAINT fkMatchedPerson 
     FOREIGN KEY 
     REFERENCES PERSON(PERSONID) 
     CONSTRAINT pkMatchedItems 
     PRIMARY KEY (ITEMID, PERSONID) 
     ) 

該表將包含大量的數據,但考慮到它只能存儲2分INT列在磁盤上佔用空間會很小。

要更新此表創建以下觸發器:

  • 在SEARCHITEMS表每當一個規則被改變或增加,這將填充MATCHEDITEMS表的觸發器。
  • PERSON表上的觸發器,它將運行更新或添加的PERSON記錄上的規則。

結果可以簡單地通過加入3個表格來呈現。

SELECT m.ITEMID, m.DESCRIPTION, m.PERSONID, p.LASTNAME 
FROM MATCHEDITEMS m 
JOIN PERSON p 
    ON m.PERSONID = p.PERSONID 
JOIN SEARCHITEMS s 
    ON m.ITEMID = s.ITEMID 
+0

+ +1提出了一個明智的解決方法。我不認爲有更好的解決方案,並且至少在初始加載完成後,這些內容會隨觸發器一起更新。 – 2011-04-06 11:29:33

+0

感謝您花時間回答此問題。我沒有想過使用觸發器來更新表的想法。 – 2011-04-06 13:11:08