2017-06-27 34 views
-2

因此,一些行,我有兩個表如下所示: 「樣品更換下列條件

sample_id|measure_id|depth|date 
    11 | 1  | 0 |2013 
    17 | 1  | 1 |2013 
    18 | 1  | 3.5 |2013 
    21 | 2  | 0 |2015 
    22 | 2  | 1 |2015 

此表包含測量現有樣本信息。 sample_id對於每個測量樣本都是唯一的,measure_id對於每個「測量活動」深度和日期都是相同的。

其他表:「Sample_details」,包含「測定每個深度的事情」的信息:

parameter_id|sample_id|value 
4512  | 11 |2,45 
4513  | 11 |1,58 
4512  | 17 |2.11  
4533  | 17 |5.36 
4512  | 18 |3,45 
4518  | 18 |7,52 
4512  | 21 |9,21 
4513  | 21 |5,12 
4515  | 21 |5,12 
4512  | 22 |5,12 
4513  | 22 |5,12  

我試圖做的就是移動的全部採樣細節將深度0插入到與深度1對應的採樣細節中(我們假設總是存在深度爲0的樣本和深度爲1的另一個樣本)。

我試圖說服這樣的:

GET sample_id從試樣臺,其中深度= 1,並用它取代sample_id在sample_details表無論sample_id等於從樣品臺到sample_id隨深度0(I需要爲每個measure_id做到這一點,因爲每一項措施ID具有0深度和1個深度值,...)

MY SQL試用:

UPDATE SDetails 
SET SDetails.sample_id = Sample.sample_id 
FROM Sample_details SDetails 
JOIN Sample Sample 
ON Sample.sample_id IN (select distinct Sample.sample_id from Sample, table2 where Sample.depth = 1 AND Sample.id2 = table2.id2) 
AND SDetails.sample_id IN (select Sample.sample_id from Sample, table2 where sample.depth =0 AND Sample.id2 = table2.id2) 

的sample_details表應該是這樣的:

parameter_id|sample_id|value 
4512  | 17 |2,45 
4513  | 17 |1,58 
4512  | 17 |2.11  
4533  | 17 |5.36 
4512  | 18 |3,45 
4518  | 18 |7,52 
4512  | 22 |9,21 
4513  | 22 |5,12 
4515  | 22 |5,12 
4512  | 22 |5,12 
4513  | 22 |5,12 
+1

何必寫入的別名是與表格的名稱相同?你應該開始使用ANSI-92風格的連接。他們已經有25年了。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx至於手頭的問題......它不在都清楚問題是什麼。這裏是開始改善你的問題的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

真的嗎?這個問題是不是很清楚? :D哇 – user2019747

+0

不..一點也不清楚...你可以請你發佈一個'以後'版本的樣本細節表,以便我們看到結果應該是什麼?在所有樣本的前後都包含一行,以便我們看到您希望如何處理不同的排列。 – JeffUK

回答

0

試試這個:

DECLARE @Sample TABLE(sample_id INT, measure_id INT, depth FLOAT, [date] INT) 
INSERT INTO @Sample (sample_id, measure_id, depth, [date]) 

SELECT 11, 1, 0, 2013 
UNION ALL 
SELECT 17, 1, 1, 2013 
UNION ALL 
SELECT 18, 1, 3.5, 2013 
UNION ALL 
SELECT 21, 2, 0, 2015 
UNION ALL 
SELECT 22, 2, 1, 2015 

DECLARE @sample_details TABLE (parameter_id INT, sample_id INT, value VARCHAR(50)) 
INSERT INTO @sample_details (parameter_id, sample_id, value) 

SELECT 4512, 11, '2,45' 
UNION ALL 
SELECT 4513, 11, '1,58' 
UNION ALL 
SELECT 4512, 17, '2.11'  
UNION ALL 
SELECT 4533, 17, '5.36' 
UNION ALL 
SELECT 4512, 18, '3,45' 
UNION ALL 
SELECT 4518, 18, '7,52' 
UNION ALL 
SELECT 4512, 21, '9,21' 
UNION ALL 
SELECT 4513, 21, '5,12' 
UNION ALL 
SELECT 4515, 21, '5,12' 
UNION ALL 
SELECT 4512, 22, '5,12' 
UNION ALL 
SELECT 4513, 22, '5,12' 

DECLARE @tmp TABLE (oldvalue INT, newvalue INT) 
INSERT INTO @tmp(oldvalue, newvalue) 
SELECT s1.sample_id, s2.sample_id 
FROM @Sample s1 
    INNER JOIN @Sample s2 ON s2.measure_id = s1.measure_id 
WHERE s1.depth = 0 
    AND s2.depth = 1 


UPDATE sd 
SET sd.sample_id = tmp.newvalue 
FROM @sample_details sd 
    INNER JOIN @tmp tmp ON tmp.oldvalue = sd.sample_id 

SELECT * FROM @sample_details 
0

像這樣的事情?

  1. 找到所有樣品+ sample_details雙其中樣品具有depth = 0
  2. 然後,對於每一對,找到相應的depth = 1樣本
  3. 然後,更新來自步驟1的sample_detail s的所述depth = 1sample_id在步驟發現小號2.

T-SQL:

UPDATE d 
    SET d.sample_id = s1.sample_id 
FROM sample_details d 
    JOIN sample s0 ON d.sample_id = s0.sample_id 
    AND s0.depth = 0 
    JOIN sample s1 ON s0.measure_id = s1.measure_id 
    AND s1.depth = 1