Написание инструкции sql с регистром

#sql #oracle-sqldeveloper

#sql #oracle-sqldeveloper

Вопрос:

Я пытаюсь написать инструкцию sql, чтобы получить описания двух столбцов из таблицы. Однако некоторые строки в столбце a.code_2 имеют значение null и не нуждаются в получении описаний. Моя инструкция sql показана ниже. Он захватывает только столбцы, которые имеют значение как в code_1, так и в code_2, а не строки, в которых.code_2 имеет значение null.

  SELECT ID, CODE_1, B.CODE_DESC, CODE_2, C.CODE_DESC
     FROM TBLCODE A, TBLDESC B, TBLDESC C
     WHERE A.CODE_1 = B.CODE1
     AND  A.CODE_2 = (CASE WHEN a.CODE_2 IS NULL THEN '' ELSE C.CODE1 END);
  

Комментарии:

1. Вредные привычки: использование объединений в старом стиле — этот стиль списка таблиц, разделенных запятыми , в старом стиле был отменен стандартом SQL ANSI- 92 (более 20 лет назад)

Ответ №1:

Похоже, вам нужно внутреннее соединение с TBLDESC таблицей для CODE_1 , если оно никогда не равно null; и внешнее соединение с той же таблицей для CODE_2 . Когда CODE_2 значение равно null, которое ничего не найдет, so C.CODE_DESC будет равно null, но превращение его во внешнее соединение означает, что TBLCODE записи не будут отброшены, что вы и видите сейчас, поскольку оба являются внутренними соединениями:

 SELECT A.ID, A.CODE_1, B.CODE_DESC AS DESC_1, A.CODE_2, C.CODE_DESC AS DESC_2
FROM TBLCODE A
JOIN TBLDESC B ON B.CODE1 = A.CODE_1
LEFT JOIN TBLDESC C ON C.CODE1 = A.CODE_2;
  

Если CODE_1 может быть null, то сделайте их оба LEFT JOIN .

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

 SELECT A.ID, A.CODE_1,
  MAX(CASE WHEN B.CODE1 = A.CODE_1 THEN B.CODE_DESC END) AS DESC_1,
  A.CODE_2,
  MAX(CASE WHEN B.CODE1 = A.CODE_2 THEN B.CODE_DESC END) AS DESC_2
FROM TBLCODE A
LEFT JOIN TBLDESC B ON B.CODE1 IN (A.CODE_1, A.CODE_2)
GROUP BY A.ID, A.CODE_1, A.CODE_2
ORDER BY A.ID;
  

Скрипка SQL.

Ответ №2:

Вам нужно ознакомиться с объединениями (внутренними и внешними). Я также не совсем уверен, что вы делаете с TBLDESC C, но это мое лучшее предположение. Левое соединение означает «показывать все столбцы с левой стороны, независимо от того, присоединяются ли они к чему-либо справа».

 SELECT ID, CODE_1, B.CODE_DESC, CODE_2, B.CODE_DESC
FROM TBLCODE AS A
LEFT JOIN TBLDESC AS B ON A.CODE_1 = B.CODE1