使用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 :(得分: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列,磁盘上的占用空间将很小。
要更新此表,请创建以下触发器:
然后可以通过加入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
答案 1 :(得分:-1)
您可以动态构建TSQL,然后使用sp_executesql执行它。