2017-02-22 34 views
0

Данные из таблицы в нашей базе данных полны ошибок. Я пытаюсь закодировать случай, когда, затем предложение, которое может потенциально заменить ошибки данными, которые являются правильными, и из другой таблицы. Имейте в виду, что у меня есть довольно простые привилегии, поэтому я не могу кодировать что-либо более сложное, чем случай, когда и когда. Код, который я до сих пор показано ниже:Корпус Когда не исправляете?

select distinct t.*, 
case 
    --** t.Corridor_RB is full of bad entries 
    when t.Corridor_RB <> s.Corridor_RB 
     then s.Corridor_RB --** what I want the data to be 
     else s.Corridor_RB 
     end as CorrectRb 
from PROJECT_CORRS_RB_MILES t left join 
corridors_grouped_tis s on 
t.Corridor_RB = s.Corridor_RB 
where t.Direction <> 5 
order by t.Corridor_RB 

Что происходит прямо сейчас, добавленный столбец CorrectRb еще полон нулям, как показано на скриншоте ниже:

enter image description here

Так почему это происходит? Почему, например, C000001N не исправляет C000001E из s.Corridor_RB? Должны ли пустые пробелы быть данными из s.Corridor_RB? Само соединение прекрасно, его одно для многих.

Вот данные corridors_grouped_tis:

TCR_CORRIDOR_ID CORRIDOR_RB SLICED 
     C000001 C000001E 1 
     C000002 C000002E 2 
     C000003 C000003N 3 
     C000004 C000004N 4 
     C000005 C000005N 5 
     C000006 C000006E 6 
     C000007 C000007N 7 
     C000008 C000008E 8 
     C000009 C000009N 9 
     C000010 C000010N 10 
     C000011 C000011N 11 
     C000012 C000012E 12 

Выход из projects_corrs_rb_miles показано ниже:

  FED_ST_PRJ_NBR CONT_ID  ROUTE_NBR DIRECTION CORRIDOR_RB BEG_TERMINI END_TERMINI 
    1 HSIP-MT 1-6(76)384    11713   N-1 3 C000001E 384.0 386.6 
    2 MT-NH 1-3(71)255    21216   N-1 3 C000001E 254.6 256.0 
    3 HSIP-MT 1-6(76)384    11713   N-1 3 C000001E 384.0 386.6 
    4 HSIP-MT 1-6(76)384    11713   N-1 3 C000001E 384.0 386.6 
    5 MT-NH 1-3(71)255    21216   N-1 3 C000001E 254.6 256.0 
    6 MT-NH 1-3(71)255    21216   N-1 3 C000001E 254.6 256.0 
    7 HSIP 1-2(147)136    07C11   N-1 1 C000001N   
    8 NH 1-1(93)16     08913   N-1 1 C000001N 16.0 44.8 
    9 CBI-NHTSA-MT 1-1(79)45   03812   N-1 1 C000001N 44.9 48.6 
    10 CBI-NHTSA-MT 1-1(79)45   03812   N-1 1 C000001N 44.9 48.6 
+1

выход вашего дела всегда будет 's.Corridor_RB'. – GurV

+0

@GurV Я пробовал просто делать null в предложении else, но, конечно же, просто оставил их как null –

+1

Кстати, [лучше размещать текст, чем изображения] (http://meta.stackoverflow.com/questions/285551/why- can-i-not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557), даже для результатов запроса. –

ответ

2

В данный момент ваше выражение случай является немного бессмысленным, поскольку обе ветви оценить то же самое, s.Corridor_RB.

Но это будет ноль, если нет соответствующей строки в s для t подряд, а потому, что вы включили условие соединения

t.Corridor_RB = s.Corridor_RB 

вы получите только матч, если они одинаковы, т.е. вы войдете в ветку «else». Для всего остального нет совпадения на s, поэтому s.Corridor_RB будет null. (Который также войдет в «else», так как вы не можете сравнивать нуль ни с чем другим с операторами/равенством).

По существу, он может быть только когда-либо равным нулю или точно такой же, как t.Corridor_RB.

Возможно, вы можете просто удалить это условие, и это может быть нормально как внутреннее соединение; но тогда вы увидите, что у вас нет других условий соединения между s и t, поэтому вы можете получить декартовое произведение (перекрестное соединение) между двумя таблицами, что вряд ли будет тем, что вы хотите.

Вам необходимо знать, как идентифицировать строку в s, которая будет иметь правильное значение на основе некоторых других столбцов в t. Вы не можете создать его в столбце, который, как вы знаете, имеет плохие записи, - если только s не имеет одной строки или имеет сопоставления между плохими и хорошими значениями, и вы присоединяетесь к или выбираете неправильный столбец. Поскольку мы не можем видеть эту структуру таблицы или данные, невозможно сказать, что вам нужно, чтобы присоединиться к действительно.


Основываясь на данных corridors_grouped_tis вы добавили, это выглядит, как вы хотите, чтобы соответствовать на основе корня, и просто изменить последний символ:

from PROJECT_CORRS_RB_MILES t left join 
corridors_grouped_tis s on 
s.TCR_CORRIDOR_ID = substr(t.Corridor_RB, 1, length(t.Corridor_RB) - 1) 

если TCR_CORRIDOR_ID делает то, что, как представляется, ; или, возможно,

substr(s.Corridor_RB, 1, length(s.Corridor_RB) - 1) 
    = substr(t.Corridor_RB, 1, length(t.Corridor_RB) - 1) 

или аналогичный, хотя это делает предположения о ваших узорах и о том, как соответствовать по-прежнему.

Применение функции к значению столбца, как правило, предотвращает использование любого индекса в этом столбце, но если это небольшая таблица поиска, это, вероятно, не имеет значения, и вы, вероятно, попадете в большую часть строк в любом случае, делая полное сканирование предпочтительным. Если бы с вами было много данных для работы, вы могли бы добавить индексированный виртуальный столбец, который выполняет подстроку, но здесь кажется излишним.

Demo с образцами данных, как КТР:

with corridors_grouped_tis(TCR_CORRIDOR_ID, CORRIDOR_RB, SLICED) as (
    select 'C000001', 'C000001E', 1 from dual 
    union all select 'C000002', 'C000002E', 2 from dual 
    union all select 'C000003', 'C000003N', 3 from dual 
    union all select 'C000004', 'C000004N', 4 from dual 
    union all select 'C000005', 'C000005N', 5 from dual 
    union all select 'C000006', 'C000006E', 6 from dual 
    union all select 'C000007', 'C000007N', 7 from dual 
    union all select 'C000008', 'C000008E', 8 from dual 
    union all select 'C000009', 'C000009N', 9 from dual 
    union all select 'C000010', 'C000010N', 10 from dual 
    union all select 'C000011', 'C000011N', 11 from dual 
    union all select 'C000012', 'C000012E', 12 from dual 
), 
project_corrs_rb_miles (FED_ST_PRJ_NBR, CONT_ID, ROUTE_NBR, DIRECTION, CORRIDOR_RB, BEG_TERMINI, END_TERMINI) as (
    select 'HSIP-MT 1-6(76)384', '11713', 'N-1', 3, 'C000001E', 384.0, 386.6 from dual 
    union all select 'MT-NH 1-3(71)255', '21216', 'N-1', 3, 'C000001N', 254.6, 256.0 from dual 
    union all select 'HSIP-MT 1-6(76)384', '11713', 'N-1', 3, 'C000001E', 384.0, 386.6 from dual 
    union all select 'HSIP-MT 1-6(76)384', '11713', 'N-1', 3, 'C000001E', 384.0, 386.6 from dual 
    union all select 'MT-NH 1-3(71)255', '21216', 'N-1', 3, 'C000001E', 254.6, 256.0 from dual 
    union all select 'MT-NH 1-3(71)255', '21216', 'N-1', 3, 'C000001E', 254.6, 256.0 from dual 
    union all select 'HSIP 1-2(147)136', '07C11', 'N-1', 1, 'C000001N', null, null from dual 
    union all select 'NH 1-1(93)16', '08913', 'N-1', 1, 'C000001N', 16.0, 44.8 from dual 
    union all select 'CBI-NHTSA-MT 1-1(79)45', '03812', 'N-1', 1, 'C000001N', 44.9, 48.6 from dual 
    union all select 'CBI-NHTSA-MT 1-1(79)45', '03812', 'N-1', 1, 'C000001N', 44.9, 48.6 from dual 
) 
select t.*, s.Corridor_RB as CorrectRb 
from PROJECT_CORRS_RB_MILES t left join 
corridors_grouped_tis s on 
s.TCR_CORRIDOR_ID = substr(t.Corridor_RB, 1, length(t.Corridor_RB) - 1) 
where t.Direction <> 5 
order by t.Corridor_RB 
/

FED_ST_PRJ_NBR   CONT_ ROU DIRECTION CORRIDOR BEG_TERMINI END_TERMINI CORRECTR 
---------------------- ----- --- ---------- -------- ----------- ----------- -------- 
MT-NH 1-3(71)255  21216 N-1   3 C000001E  254.6   256 C000001E 
HSIP-MT 1-6(76)384  11713 N-1   3 C000001E   384  386.6 C000001E 
HSIP-MT 1-6(76)384  11713 N-1   3 C000001E   384  386.6 C000001E 
MT-NH 1-3(71)255  21216 N-1   3 C000001E  254.6   256 C000001E 
HSIP-MT 1-6(76)384  11713 N-1   3 C000001E   384  386.6 C000001E 
MT-NH 1-3(71)255  21216 N-1   3 C000001N  254.6   256 C000001E 
HSIP 1-2(147)136  07C11 N-1   1 C000001N       C000001E 
NH 1-1(93)16   08913 N-1   1 C000001N   16  44.8 C000001E 
CBI-NHTSA-MT 1-1(79)45 03812 N-1   1 C000001N  44.9  48.6 C000001E 
CBI-NHTSA-MT 1-1(79)45 03812 N-1   1 C000001N  44.9  48.6 C000001E 

10 rows selected. 
+0

Да, это проблема с отправкой связанных с базой данных вопросов на SO, вы не можете видеть, как DB может помочь только до сих пор. Хорошо, спасибо за отличное объяснение, это имеет смысл. Люди в этой области просто не вводят данные правильно, и это вызывает много проблем для нас. –

+0

Вы можете отобразить структуру и образцы данных из 'rootsors_grouped_tis', хотя это может показать, как эти таблицы могут быть объединены. Или, может быть, нет, или, может быть, вы уже знаете, как это сделать ... –

+0

Я мог бы отправлять данные circleors_grouped_tis своей простой таблицей, но может помочь. Его простое соединение, но стоит показать в любом случае –