[英]SQL self-join to return specific rows
跳到底部以避免冗長的解釋
好的,所以。
我正在公司內部網上工作以管理客戶工作。 作業由Elements組成:示例元素可能是“構建六頁網站”或“設計徽標”。
每個元素都包含一系列角色時間,因此“構建一個六頁網站”可能包括四個小時的“開發人員”費率和兩個小時的“設計師”費率(好吧,也許更長一點:)
顯然,不同的客戶獲得不同的小時費率。 而且,盡管已經在系統中考慮到了這一點,但它並沒有給我們足夠的靈活性。 傳統上,我們的客戶經理非常......特別......他們的定價:“構建一個六頁網站”元素可能包括客戶“Bob”的標准四小時開發人員,但客戶“八小時”哈里”。
忍受我。 我很快就會得到實際的代碼。
當然,元素存儲在“Elements”數據庫表中 - 該表僅由ID和文本標簽組成。
我正在進行的“我們需要客戶特定元素”問題的解決方案是在此表中添加“客戶”字段。 然后我們可以瀏覽並添加任何特定於客戶端的可用元素版本,並根據需要進行調整。
當客戶經理去為他們的工作添加元素時,他們應該只看到(a)任何人都可以使用的元素 - 也就是說,他們有一個NULL客戶端字段,或者(b)特定於作業客戶端。
到目前為止,SELECT WHERE。
但這不會削減它。 如果我專門為Harry添加第二個“構建六頁網站”元素,那么為Harry工作添加元素的客戶經理將看到標准版本和Harry的元素版本。 這不好。 如果沒有適用的客戶端特定版本,他們應該只看到標准版本。
好的... soooo:除了在元素表中添加“client”字段外,還要添加“父元素”字段。 然后,我們可以做一些神奇的自我引用,包括將表連接到自身,並僅獲取相關角色。
因此,我期待已久的問題是:
哦,看,一個實際的問題
id label client parent_element
1 Standard Thing NULL NULL
2 Harrys Thing 1 1
3 Bobs Thing 2 1
4 Different Thing NULL NULL
給定此表結構,如何編寫單個SQL查詢以接受“客戶端ID”參數並返回:
對於額外獎勵積分,結果應包括父元素標簽。 因此,對於客戶端ID 1,例如:
id label standardised_label client parent_element
2 Harrys Thing Standard Thing 1 1
4 Different Thing Different Thing NULL NULL
SELECT mm.*, md.label AS standardized_label
FROM mytable md
LEFT JOIN
mytable mc
ON mc.parent_element = md.id
AND mc.client = @client
JOIN mytable mm
ON mm.id = COALESCE(mc.id, md.id)
WHERE md.client IS NULL
在(client, parent_element)
上創建一個索引(client, parent_element)
以便快速工作。
請參見SQLFiddle 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.