2016-03-03 3 views
0

У меня есть две таблицыОбновление таблицы со значениями другой таблицы без ПК

+-------+----+ 
| name | id | 
+-------+----+ 
| < -5 | 1 | 
| -2 | 5 | 
| -1 | 6 | 
| 0  | 7 | 
| + 1 | 8 | 
| + 3 | 9 | 
| + 5 | 10 | 
| > 60 | 17 | 
+-------+----+ 
Table 2: 
+------------+------------+-------------------+-------------------+ 
| diff_date1 | diff_date2 | variance_id_date1 | variance_id_date2 | 
+------------+------------+-------------------+-------------------+ 
|   0 |   0 |     0 |     0 | 
|  -21 |  -21 |     0 |     0 | 
|   5 |   5 |     0 |     0 | 
|   58 |   58 |     0 |     0 | 
|   4 |   4 |     0 |     0 | 
+------------+------------+-------------------+-------------------+ 

Обновление variance_id_date1 и variance_id_date2 в таблице 2, с ID из таблицы 1

Ожидаемый результат

+------------+------------+-------------------+-------------------+ 
| diff_date1 | diff_date2 | variance_id_date1 | variance_id_date2 | 
+------------+------------+-------------------+-------------------+ 
|   0 |   0 |     7 |     7 | 
|  -21 |  -21 |     1 |     1 | 
|   5 |   5 |    10 |    10 | 
|   58 |   58 |    10 |    10 | 
|   4 |   4 |     9 |     9 | 
+------------+------------+-------------------+-------------------+ 

Я не хочу жестко кодировать значения.

Мои попробовать

update @table1 
set variance_id_date1 = (select id from @table where name = cast(diff_date1 as varchar)) 
,variance_id_date1 = (select id from @table where name between cast(diff_date1 as varchar) and ) 
+0

Так что '<5' становится id = 1, следующая строка'> = - 5 и <-2' становится id = 5 и так далее, пока '> = 3 и <5' не станет id = 10 ... тогда что ? –

+0

@TT. От 3 до 4 - 9. От 5 до 60 - 10. – Kason

+0

@Loser Я просто работаю над списком. Начиная со второй строки, условие выглядит как '> = предыдущее имя И <текущее имя ---> текущий идентификатор. –

ответ

3

здесь мое предложение:

+-------+-------+----+ 
| start | end | id | 
+-------+-------+----+ 
| NULL | -5 | 1 | 
| -4 | -2 | 5 | 
| -1 | -1 | 6 | 
| 0  | 0  | 7 | 
| 1  | 2  | 8 | 
| 3  | 4  | 9 | 
| 5  | 60 | 10 | 
| 61 | NULL | 17 | 
+-------+-------+----+ 

затем просто присоединиться к нему с соответствующей обработки

+1

От нуля до * -6 * следует 1, от * -5 * до -2 - 5 – Kason

1

В выберите сценарий с выходом образца NULL:

SELECT DISTINCT a.diff_date1 
       ,CASE WHEN b.Equal IS NOT NULL THEN Equal 
       WHEN c.Greater IS NOT NULL THEN c.Greater 
       ELSE d.Less END as variance_id_date1_Up 
FROM [mASter].[dbo].[tableName2] AS a LEFT OUTER JOIN 
(SELECT [diff_date1] 
,CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'+',''),' ','')) = 1 AND CAST([diff_date1] AS int) = CAST(REPLACE(REPLACE(b.name ,'+',''),' ','') AS int) then b.id 
    ELSE NULL END AS [Equal] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b) AS b 
    on a.diff_date1 =b.diff_date1 AND b.Equal IS NOT NULL 
    LEFT OUTER JOIN 
    (SELECT [diff_date1] 
    ,Max(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','')) = 1 AND CAST([diff_date1] AS int) > REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','') then b.id ELSE NULL END AS int)) AS [Greater] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS c 
    on a.diff_date1 = c.diff_date1 AND c.Greater IS NOT NULL AND b.diff_date1 IS NULL 
    LEFT OUTER JOIN 
    (SELECT [diff_date1] 
    ,Min(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'<',''),' ','')) = 1 AND CAST([diff_date1] AS int) < CAST(REPLACE(REPLACE(b.name ,'<',''),' ','') AS int) then b.id ELSE NULL END AS int))AS [Less] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS d 
    on a.diff_date1 =d.diff_date1 AND b.diff_date1 IS NULL AND c.diff_date1 IS NULL 


Пример вывода:

diff_date1 variance_id_date1 
    0     7 
    -21    1 
    4     9 
    5     10 
    58    10 

Обновление сценария:

Update [tableName2] set variance_id_date1 = variance_id_date1_Up from(
SELECT DISTINCT a.diff_date1 
       ,CASE WHEN b.Equal IS NOT NULL THEN Equal 
       WHEN c.Greater IS NOT NULL THEN c.Greater 
       ELSE d.Less END as variance_id_date1_Up 
FROM [mASter].[dbo].[tableName2] AS a LEFT OUTER JOIN 
(SELECT [diff_date1] 
,CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'+',''),' ','')) = 1 AND CAST([diff_date1] AS int) = CAST(REPLACE(REPLACE(b.name ,'+',''),' ','') AS int) then b.id 
    ELSE NULL END AS [Equal] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b) AS b 
    on a.diff_date1 =b.diff_date1 AND b.Equal IS NOT NULL 
    LEFT OUTER JOIN 
    (SELECT [diff_date1] 
    ,Max(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','')) = 1 AND CAST([diff_date1] AS int) > REPLACE(REPLACE(REPLACE(b.name ,'>',''),' ',''),'+','') then b.id ELSE NULL END AS int)) AS [Greater] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS c 
    on a.diff_date1 = c.diff_date1 AND c.Greater IS NOT NULL AND b.diff_date1 IS NULL 
    LEFT OUTER JOIN 
    (SELECT [diff_date1] 
    ,Min(CAST(CASE WHEN ISNUMERIC(REPLACE(REPLACE(b.name ,'<',''),' ','')) = 1 AND CAST([diff_date1] AS int) < CAST(REPLACE(REPLACE(b.name ,'<',''),' ','') AS int) then b.id ELSE NULL END AS int))AS [Less] 
    FROM [mASter].[dbo].[tableName2] AS a CROSS JOIN [mASter].[dbo].[tableName] AS b GROUP BY [diff_date1]) AS d 
    on a.diff_date1 =d.diff_date1 AND b.diff_date1 IS NULL AND c.diff_date1 IS NULL) AS INPUT 
    where [tableName2].diff_date1 = INPUT.diff_date1 


Не забудьте изменить имя таблицы или столбцы имя.

Смежные вопросы