SQL Server 2005 - 根据表列中的条件加入

时间:2011-04-06 10:17:04

标签: sql 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)

但我无法看到让这项工作的方法。任何帮助或想法赞赏。

2 个答案:

答案 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列,磁盘上的占用空间将很小。

要更新此表,请创建以下触发器:

  • 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 

答案 1 :(得分:-1)

您可以动态构建TSQL,然后使用sp_executesql执行它。