2017-06-27 2 views
-2

Also, ich habe zwei Tabellen wie die folgenden: „ProbeErsetzen Sie einige Zeilen nach einer Bedingung

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 

diese Tabelle gemessen Informationen über bestehende Proben enthält. Die sample_id ist für jede gemessene Probe einzigartig, die measure_id ist für jede "Messkampagne" die gleiche Tiefe und das gleiche Datum.

Die andere Tabelle: „Sample_details“, enthält Informationen über „die Dinge, die für jede Tiefe gemessen wurden“:

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  

Das, was ich zu tun versuchen, all Probenahme bewegen Details die Tiefe 0 in die Abtastungsdetails, die der Tiefe 1 entsprechen (wir nehmen an, dass immer eine Probe der Tiefe 0 und eine andere der Tiefe 1 vorhanden ist).

Ich habe versucht, so zu argumentieren:

get sample_id von Probentisch, wo Tiefe = 1 und damit die sample_id in sample_details Tabelle ersetzen, wo immer sample_id gleich ist mit der Tiefe von Beispieltabelle sample_id 0. (I muß dies für jeden measure_id tun, denn jede Maßnahme id 0 Tiefe und 1 Tiefenwert hat, ...)

MY SQL Versuch:

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) 

Die sample_details Tabelle sollte wie folgt aussehen:

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

Warum ein Alias ​​plagen zu schreiben, das ist Wie der Name der Tabelle? Und Sie sollten ANSI-92-Joins verwenden. Sie gibt es seit 25 Jahren. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx In Bezug auf die vorliegende Frage ... ist es nicht alles klar, was das Problem ist. Hier ist ein großartiger Ort, um mit der Verbesserung Ihrer Frage zu beginnen. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

+0

Wirklich? ist es nicht klar, was das Problem ist? : D wow – user2019747

+0

Nein .. überhaupt nicht klar ... könnten Sie bitte eine 'nach' Version Ihrer Beispieldetailliertabelle posten, damit wir sehen, was das Ergebnis sein sollte?Einschließlich einer Zeile für ALL-Samples im Vorher-Nachher, damit wir sehen können, wie die verschiedenen Permutationen gehandhabt werden sollen. – JeffUK

Antwort

0

starten:

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

So etwas wie das?

  1. Alle Probe + sample_details Paaren, bei denen die Probe eine depth = 0 hat.
  2. Dann finden Sie für jedes Paar die entsprechenden depth = 1Probe.
  3. Dann aktualisieren Sie die sample_detail s aus Schritt 1 mit dem depth = 1sample_id in Schritt gefunden s 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 
Verwandte Themen