2012-07-12 217 views
1

我有一個mySQL表,其中包含一組參考數據。我有另一張包含數據的表格,用於描述此參考數據的更新或附加條目。由於各種原因,我不會介入,重要的是參考數據保持不變,因爲特定的用戶來創建記錄(因此第二張表)。這些表之間的模式與具有2鍵複合主鍵的「自定義」表的例外是相同的。其中一列是「自定義」和參考表之間共享的。是否可以將此業務邏輯放入SQL查詢中?

我想在一個單獨的SQL語句來執行這些表的業務邏輯如下:

如果在「自定義」表中存在具有相同鍵的值是什麼在參考表中的記錄,然後採取「習俗」。否則,取參考值。

我想也許我可以使用RIGHT JOIN,或者甚至可以使用UNION運算符來控制返回的內容。我一直在爭論SQL的邏輯。 JOIN將從一個表中獲取信息與另一個表中的信息進行連接,這是我真正不需要的。 UNION將簡單地移除表格之間的重複...,這很接近。

喜歡的東西:

SELECT * FROM定製UNION SELECT * FROM參考

除了這隻會下降重複,如果所有列是相同的。如果有任何不同(這將是自定義條目存在的原因),那麼UNION除了將兩個表格的內容混合在一起外什麼都不做。

我對這一切都錯了嗎?

感謝您提供的任何見解。

回答

3

有幾種方法可以做到這一點。下面是應該得到你所需要的,至少根據我自己的情況解釋工會:

select KeyCol, Col2, Col3 
from CustomTable 
union all 
select KeyCol, Col2, Col3 
from RefTable 
where KeyCol not in (select KeyCol from CustomTable) 

我假設你的表reftable和CustomTable有一到零或一的關係,如在中,您沒有任何Ref的多個自定義記錄(但這種方式仍然可以)。

更新:

您也可以從自定義希望你額外的鍵柱:

select KeyCol, Col2, Col3, CustomKey 
from CustomTable 
union all 
select KeyCol, Col2, Col3, null as CustomKey 
from RefTable 
where KeyCol not in (select KeyCol from CustomTable) 
+0

因此,從兩個表中獲取所有記錄,然後在where子句中嘗試過濾出結果集中具有其自定義表中的鍵的記錄。對?這是否意味着最終結果集將缺少其自定義表中存在鍵值的記錄? – Raevik 2012-07-12 20:40:53

+0

Wellll,有點。我的自定義表有一個額外的主鍵列,這意味着技術上可能會有多個自定義記錄,並且具有與參考表中的一條記錄相同的keyVal。 – Raevik 2012-07-12 20:43:20

+0

Where子句適用於每個單獨的選擇,而不是整個聯合查詢。儘管如此,一個'order by'可能會結束整個事情。 – 2012-07-12 20:46:03

1

聽起來像一個左外連接,其左右值爲COALESCE()。

SELECT COALESCE(c.val, r.val) as val, ... 
FROM reference as r LEFT OUTER JOIN custom as c ON c.ID = r.ID AND c.Project = 'ProjectX' 
+0

我的SQL-foo是謙虛的。我想你只是讓我的大腦爆炸了。我會開始使用Google。 – Raevik 2012-07-12 20:41:31

+0

我重新讀你的問題,我不明白你的表是如何相關的,因爲你提到了一個只在自定義表中的兩部分鍵。我還看到你在聯合和工會之間的困惑。 Lossely,加入水平結合表和聯合垂直結合。 – shawnt00 2012-07-12 20:46:48

+0

有許多用戶對這些數據進行「項目」處理。定製表保存參考數據的所有更新/新記錄的條目。因此,ID,項目的組合鍵。參考表沒有項目列。 – Raevik 2012-07-12 20:52:30

0

有了歸屬地@TimLehner,你可能想要的是他的查詢稍作修改。我的猜測是你想要最近的客戶修改。我會進一步猜測這是最大的自定義鍵。

爲了得到這一點,你需要查詢一個條款:

select KeyCol, Col2, Col3, CustomKey 
from CustomTable ct join 
    (select max(CustomKey) as maxCustomKey from CustomTable group by KeyCol, Col2 Col3 
    ) lastkey 
    on ct.KeyCol = lastkey.KeyCol and ct.Col2 = lastkey.Col2 and ct.Col3 = lastkey.Col3 
union all 
select KeyCol, Col2, Col3, null as CustomKey 
from RefTable 
where KeyCol not in (select KeyCol from CustomTable) 

順便說一句,在大多數其他數據庫,你會使用一個簡單的查詢和函數調用ROW_NUMBER()做到這一點,但MySQL的不支持這種類型的功能。