簡體   English   中英

SQL自聯接以返回特定行

[英]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,第2行和第4行
  • 對於客戶端ID 2,第3行和第4行
  • 對於客戶端ID 42,第1行和第4行

對於額外獎勵積分,結果應包括父元素標簽。 因此,對於客戶端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.

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