Я опаздываю на вечеринку, но я просто добавлю свой предпочтительный стиль форматирования, который я, должно быть, выучил из книг и руководств: он компактен. Вот пример SELECT
утверждения:
SELECT st.column_name_1, jt.column_name_2,
sjt.column_name_3
FROM source_table AS st
INNER JOIN join_table AS jt USING (source_table_id)
INNER JOIN second_join_table AS sjt ON st.source_table_id = sjt.source_table_id
AND jt.column_3 = sjt.column_4
WHERE st.source_table_id = X
AND jt.column_name_3 = Y
Вкратце: отступ в 8 пробелов, ключевые слова в заглавных буквах (хотя SO красит их лучше, когда они в нижнем регистре), отсутствие верблюда (бессмысленно в Oracle) и перенос строк при необходимости.
UPDATE
:
UPDATE target_table
SET column_name_1 = @value,
column_name_2 = @value2
WHERE condition_1 = @test
А INSERT
:
INSERT INTO target_table (column_name_1, column_name_2,
column_name_3)
VALUES (@value1, @value2, @value3)
Теперь позвольте мне первым признать, что у этого стиля есть свои проблемы. Отступ в 8 пробелов означает, что ORDER BY
и GROUP BY
либо смещают отступ, либо разбивают слово BY
на себя. Также было бы более естественным сделать отступ для всего предиката предложения WHERE
, но я обычно выравниваю после операторов AND
и OR
на левом поле. Отступ после перенесенных INNER JOIN
строк также несколько произвольный.
Но по какой-то причине мне все же легче читать, чем альтернативы.
Я закончу с одним из моих более сложных творений в последнее время, используя этот стиль форматирования. Почти все, что вы встретите в операторе SELECT
, обнаруживается в этом. (Он также был изменен, чтобы скрыть его происхождение, и я, возможно, допустил ошибки при этом.)
SELECT term, student_id,
CASE
WHEN ((ft_credits > 0 AND credits >= ft_credits) OR (ft_hours_per_week > 3 AND hours_per_week >= ft_hours_per_week)) THEN 'F'
ELSE 'P'
END AS status
FROM (
SELECT term, student_id,
pm.credits AS ft_credits, pm.hours AS ft_hours_per_week,
SUM(credits) AS credits, SUM(hours_per_week) AS hours_per_week
FROM (
SELECT e.term, e.student_id, NVL(o.credits, 0) credits,
CASE
WHEN NVL(o.weeks, 0) > 5 THEN (NVL(o.lect_hours, 0) + NVL(o.lab_hours, 0) + NVL(o.ext_hours, 0)) / NVL(o.weeks, 0)
ELSE 0
END AS hours_per_week
FROM enrollment AS e
INNER JOIN offering AS o USING (term, offering_id)
INNER JOIN program_enrollment AS pe ON e.student_id = pe.student_id AND e.term = pe.term AND e.offering_id = pe.offering_id
WHERE e.registration_code NOT IN ('A7', 'D0', 'WL')
)
INNER JOIN student_history AS sh USING (student_id)
INNER JOIN program_major AS pm ON sh.major_code_1 = pm._major_code AND sh.division_code_1 = pm.division_code
WHERE sh.eff_term = (
SELECT MAX(eff_term)
FROM student_history AS shi
WHERE sh.student_id = shi.student_id
AND shi.eff_term <= term)
GROUP BY term, student_id, pm.credits, pm.hours
)
ORDER BY term, student_id
Эта мерзость вычисляет, является ли студент полным или неполным рабочим днем в данный семестр. Независимо от стиля, этот труден для чтения.