#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;
Ответ №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