我不負責這個設計,但我必須從這種模式,它看起來是這樣的(SQL Server 2000中)提取數據:檢索從表中的數據,其中一個具有多個列指向在其它相同的主鍵?
CREATE TABLE contract
(
contract_id int,
account_id int, /* account table */
responsible_id int, /* account table */
holding_id int, /* account table */
billingaddress_id int, /* address table */
deliveryaddress_id int, /* address table */
)
CREATE TABLE address
(
address_id int,
postalcode char(4),
)
CREATE TABLE account
(
account_id int,
firstname varchar(40),
billingaddress_id int, /* address table */
deliveryaddress_id int, /* address table */
)
的ACCOUNT_ID,responsible_id和holding_id在合約表可以爲空,共享值或具有不同的值。它可能有也可能沒有賬單和/或送貨地址。 一個帳戶實體總是有一個計費或送貨地址,都可以是相同的。
我必須找到與合同有關的所有帳戶(即合同具有相同的帳戶,負責人或持有ID作爲帳戶ID),並與具有特定郵政編碼的地址(直接或通過合同)。
的問題似乎是2倍:
一)檢索)從過濾的結果與合同 B關聯賬戶(一),以獲得具有一定郵政編碼
這不起作用關聯賬戶因爲如果ACCOUNT_ID不與有問題的郵政編碼相關,但holding_id,那麼它不會返回:
FROM account
INNER JOIN contract
ON account.account_id =
CASE WHEN NOT IsNull(contract.account_id) THEN contract.account_id
WHEN NOT IsNull(contract.responsible_id) THEN contract.responsible_id
ELSE contract.holding_id END
這是迄今爲止因某種原因太慢(FK的未索引 - 等待30分鐘,它未返回):
FROM account
INNER JOIN contract
ON account.account_id = contract.account_id
OR account.account_id = contract.responsible_id
OR account.account_id = contract.holding_id
似乎已經工作的唯一的事情是一個聯盟,但我仍然留下了通過地址類型篩選結果的問題。
什麼是返回所需的結果最短的方法?目前我傾向於創建一個臨時表來存儲中間數據。
你可能已經簡化了這個問題你CREATE TABLE語句,但現在看來,你的表實際上沒有主鍵,這可能是負責你的連接查詢是如何執行緩慢(30分鐘有任何疑問是一個標誌的一個主要問題)。 – MusiGenesis 2009-08-26 14:00:58
CREATE和FROM子句被簡化了,主鍵確實存在,但我認爲這些表沒有正確索引。不幸的是,我無能爲力。 – ilitirit 2009-08-26 14:11:39