В данный момент ваше выражение случай является немного бессмысленным, поскольку обе ветви оценить то же самое, 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.
выход вашего дела всегда будет 's.Corridor_RB'. – GurV
@GurV Я пробовал просто делать null в предложении else, но, конечно же, просто оставил их как null –
Кстати, [лучше размещать текст, чем изображения] (http://meta.stackoverflow.com/questions/285551/why- can-i-not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557), даже для результатов запроса. –