2010-06-10 6 views
0

Мне нужно выбрать имя и фамилию в таблице, которая отлично работает в следующем SQL, но часть, которая не работает, является функцией NVL. Файл должен отображать все пилоты в компании, летающей на вертолетах, и, если у них нет лицензии, поле HT_NAME должно появиться как «N/A», а поле для конечных часов должно быть 0. Я поставил функцию NVL как мои текстовые данные, но он все еще не работает. Я сделал синтаксическую ошибку? Помощь была бы оценена.Использование функции NVL в SQL, пожалуйста, помогите!

Select E.EMP_NBR, E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME, E.EMP_PILOT, 
     ED.HT_NBR, NVL(HT.HT_NAME, 'N/A'), NVL(ED.END_HRS_FLOWN, 0), 
     ED.END_LAST_ANNUAL_REVIEW_DATE 
From ENDORSEMENT ED, EMPLOYEE E, HELICOPTER_TYPE HT 
WHERE HT.HT_NBR = ED.HT_NBR (+) 
ORDER BY ED.END_HRS_FLOWN DESC, E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME ASC; 

должны работники, не являющиеся пилоты появляются с N/A под вертолетную типа и 0 при летных часов. Он не работает - даже если я попробовал несколько вещей, чтобы его восстановить.

+0

Что вы получаете, когда ожидаете появления «N/A» и «0»? –

+0

Значения остаются такими же, как раньше. Они вообще не меняются! – Mila

+0

Можете ли вы опубликовать результаты, которые вы получаете во время выполнения запроса – Bharat

ответ

1

У вас есть три таблицы и только одно условие соединения; вам необходимо соединение между Employee и Endorsement. Без этого вы получаете кросс-продукт или декартово соединение между этими таблицами.

С N таблицами (N> 0) вам нужно как минимум условие объединения J = N-1. У вас есть N = 3 таблицы, но J = 1 условия соединения - это слишком мало. (Существуют различные причины, по которым вам может понадобиться J> N - 1, но главный из них состоит в том, что вам нужно объединить два столбца между двумя таблицами. Если вы считаете каждое условие A.Col1 = B.Col2 как отдельное условие соединения , тогда вам нужно J> N-1, если вы считаете пару условий «A.Col1 = B.Col2 AND A.Col3 = B.Col4» как условие единственного соединения, тогда вам все равно нужен только J = N-1 условия.)

В идеале вы также должны уйти от архаичной нестандартной нотации внешнего соединения с помощью «(+)» и использовать стандартные соединения SQL.


Обозначение является второстепенным вопросом. Каждая строка в Employee соединяется с каждой строкой в ​​Endorsement, а затем этот кросс-продукт является внешним соединением с Helicopter_type. Это (почти наверняка) не запрос, который требуется.

Вы, вероятно, нужно добавить некоторые вариации этого в предложении WHERE:

AND E.EMP_NBR = ED.EMP_NBR 

(где фактический столбец в таблице одобрения (ЭД) не отображается в запросе, так что «ED.EMP_NBR» это предположение).

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

+0

, это было так, как меня учили, спасибо, хотя и плохо смотрю в другом месте в Интернете по-другому. – Mila

+0

+1 для рекомендации по использованию синтаксиса JOIN. Это точно иллюстрирует одно из преимуществ JOINs по сравнению с старым синтаксисом: ясность/удобочитаемость. – DCookie

+0

@DCookie: ясность и читаемость не являются неотъемлемыми качествами синтаксиса ANSI join. Я был программистом Oracle 20 лет и нашел большую часть синтаксиса ANSI почти непонятным. Без какой-либо подготовки в новом синтаксисе вы могли бы писать по-гречески большую часть времени. – AndyDan

0

Проверьте, имеют ли HT_NAME и END_HRS_FLOWN нулевые значения или нет для строк, которые вы ожидаете. N/А или 0

Edit 1

В Oracle функция NVL позволяет вам заменить значение, когда встречается нулевое значение.

Синтаксис функции NVL является:

NVL(string1, replace_with) 

string1 является строка для проверки на нулевое значение.

replace_with - это значение, возвращаемое, если string1 равно null.

Если значение не нулевая, он будет возвращать одинаковое значение

+0

они делают! Однако, спасибо! – Mila

1

Как сказал @ Джонатан, вам нужно что-то добавить к ИНЕКЕ сказать базе данных, как совпасть EMPLOYEE с ОДОБРЕНИЮ. В целях обсуждения мы будем использовать поле EMP_NBR для обоих, но вам нужно будет изменить запрос, чтобы использовать поле, которое является правильным. Нам также необходимо знать, какое поле говорит вам, имеет ли сотрудник действительную лицензию. Я предполагаю, что это что-то в таблице ENDORSEMENT - назовем его ENDORSEMENT.LICENSE_TYPE для обсуждения. После того, как вы знаете, что вы можете использовать функцию NVL2 для изменения значений, возвращаемых запросом соответствующим образом, а именно:

SELECT E.EMP_NBR, 
     E.EMP_FIRSTNAME || ' ' || E.EMP_LASTNAME AS FIRST_LAST_NAME, 
     E.EMP_PILOT, 
     ED.HT_NBR, 
     NVL2(ED.LICENSE_TYPE, HT.HT_NAME, 'N/A') HELO_TYPE, 
     NVL2(ED.LICENSE_TYPE, ED.END_HRS_FLOWN, 0) FLOWN_HOURS, 
     ED.END_LAST_ANNUAL_REVIEW_DATE 
    FROM ENDORSEMENT ED, 
     EMPLOYEE E, 
     HELICOPTER_TYPE HT 
    WHERE HT.HT_NBR = ED.HT_NBR (+) AND 
     ED.EMP_NBR = E.EMP_NBR (+) 
    ORDER BY ED.END_HRS_FLOWN DESC, 
      E.EMP_LASTNAME ASC, 
      E.EMP_FIRSTNAME ASC; 

Я также изменил предложения ORDER BY, чтобы получить заказанный сотрудников в более нормальной манере.

Делитесь и наслаждайтесь.

+0

Интересная точка - я бы не поставил вторую внешнюю нотацию присоединения, но, вероятно, необходимо иметь внешнее соединение между Employee и Endorsement; Интересно, однако, если соединение между Endorsement и Helicopter_Type должно быть внутренним соединением, в конце концов? В принципе, это детализация OP для решения. –

+0

Привет, благодарю вас за это, дело в таблице employee не имеет каких-либо ПК или FK, которые я могу использовать для присоединения к другим таблицам, поэтому я не создал для вас объединение, если вы не можете найти PK или FK Присоединяйся к ним? мне сказали иначе! мне сказали, что ЕСЛИ не существует внешнего ключа, доступного для соединения, тогда вы не можете присоединиться к двум таблицам. – Mila

+0

О, действительно, вы правы, в поле лицензии вы добавили поле EMP_PILOT, но это не NULL, это CHAR. Если они являются пилотом, то это Y, если он не отображается как N. Поэтому я не знаю, будет ли NVL работать на основе этого, поскольку нет NULL. – Mila