簡體   English   中英

SQL Server 2005 - 根據表列中的條件加入

[英]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列,磁盤上的占用空間將很小。

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

  • 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 

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM