[英]SQL Server 2005 -Join based on criteria in table column
使用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)
但我看不出讓這項工作成為現實的方法。 任何幫助或想法贊賞。
看到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列,磁盤上的占用空間將很小。
要更新此表,請創建以下觸發器:
然后可以通過加入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
您可以動態構建TSQL,然后使用sp_executesql執行它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.