복붙노트

[SQL] SQL 표준 포맷

SQL

SQL 표준 포맷

내 마지막 직장에서, 우리는 매우 데이터베이스 무거운 응용 프로그램에서 일했다, 나는 몇 가지 포맷 표준을 개발 우리가 공통 레이아웃 모든 쓰기 SQL을 것이다 그래야. 우리는 또한 코딩 표준을 개발,하지만 난 여기에 가지 않을 것이다, 그래서이 더 특정 플랫폼에서만 사용할 수 있습니다.

나는 다른 사람들이 SQL은 표준 서식에 사용하는 것을 알고 관심이 있어요. 대부분의 다른 코딩 환경과는 달리, 나는 그들을 위해 온라인 합의의 많은 부분을 발견하지 않았습니다.

주요 질의 유형을 포함합니다 :

select
    ST.ColumnName1,
    JT.ColumnName2,
    SJT.ColumnName3
from 
    SourceTable ST
inner join JoinTable JT
    on JT.SourceTableID = ST.SourceTableID
inner join SecondJoinTable SJT
    on ST.SourceTableID = SJT.SourceTableID
    and JT.Column3 = SJT.Column4
where
    ST.SourceTableID = X
    and JT.ColumnName3 = Y

이 라인 피드에 대한 몇 가지 의견 차이는 선택 후였다에서 어디. 선택 행의 의도는 레이아웃을 변경하지 않고 예 : "최고 X"와 같은 다른 사업자를 허용하는 것입니다. 단순히 키 쿼리 요소 후 일관된 줄 바꿈을 유지, 그 다음에 계속되는 것은 가독성 좋은 수준의 결과를 보였다.

에서 어디서 후 줄 바꿈을 삭제하는 것은 이해할 개정 될 것이다. 그러나, 아래의 업데이트와 쿼리에서, 우리는 후에 라인 피드 어디 우리에게 좋은 열 정렬을주는 것을 알 수있다. 마찬가지로하여 그룹화 한 후 라인 피드 또는 순서가 명확하고 읽기 쉬운 우리의 열 레이아웃을 유지합니다.

update
    TargetTable
set
    ColumnName1 = @value,
    ColumnName2 = @value2
where
    Condition1 = @test

마지막으로, 삽입 :

insert into TargetTable (
    ColumnName1,
    ColumnName2,
    ColumnName3
) values (
    @value1,
    @value2,
    @value3
)

대부분의 경우, 이러한 그러나 그들이 다른, 그런데 MS SQL 서버 경영진 스튜디오 / SQL 밖으로 쿼리 분석기 쓰기에서 멀리 그것을 벗어나지 않는다.

나는이 주제에 대한 스택 오버플로 지역 사회에서 어떤 합의가 있는지 뵙기를 기대합니다. 나는 끊임없이 많은 개발자들이 다른 언어의 표준 형식을 따르 갑자기 SQL을 타격 할 때 너무 무작위로 갈 수있는 방법을 놀라게하고있다.

해결법

  1. ==============================

    1.난 당신이 쉽게 소스 코드를 읽을 수 있습니다 너무 오래 같은 의견입니다, 형식은 차입니다. 너무 오래 이러한 목적이 달성 될 때 채택 할 수 있습니다 좋은 레이아웃 스타일은 여러 가지가있을 수 있습니다.

    난 당신이 쉽게 소스 코드를 읽을 수 있습니다 너무 오래 같은 의견입니다, 형식은 차입니다. 너무 오래 이러한 목적이 달성 될 때 채택 할 수 있습니다 좋은 레이아웃 스타일은 여러 가지가있을 수 있습니다.

    나에게 중요한 유일한 다른 측면은 당신이 당신의 가게에서 채택이 지속적으로 모든 코더에 의해 사용되도록 선택하는 것이 어떤 코딩 레이아웃 / 스타일입니다.

    그냥 참조를 위해, 여기 당신이 제공 한 예를 들어, 그냥 내 레이아웃 환경을 제공 할 방법이다. 조인으로 특정 참고로 ON 절은 기본이 (가) (즉, 키 일치)에 가입하고, 다른 조건이 where 절에 이동에 조건이 나열되어 가입, 같은 줄에 있습니다.

    select
        ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
    from 
        SourceTable ST
    inner join JoinTable JT on 
        JT.SourceTableID = ST.SourceTableID
    inner join SecondJoinTable SJT on 
        ST.SourceTableID = SJT.SourceTableID
    where
            ST.SourceTableID = X
        and JT.ColumnName3 = Y
        and JT.Column3 = SJT.Column4
    

    하나의 팁은, 자신 레드 게이트에서 프롬프트 SQL의 사본을 얻을. 당신은 당신의 원하는 레이아웃 기본 설정을 사용할 수있는 도구를 사용자 정의 할 수 있으며, 모든 사용할 수 있습니다 가게에서 코더는 같은 코딩 표준을 모두 채택하고 있는지 확인할 수도 있습니다.

  2. ==============================

    2.늦은 대답 만 잘하면 유용합니다.

    늦은 대답 만 잘하면 유용합니다.

    더 큰 개발 팀의 일원으로 일하고 나의 경험은 당신이 가서 당신이 원하는 기준을 정의 할 수 있지만 문제는 실제로이 집행 또는 매우 쉽게 개발자가 구현하기 위해 그것을하고있다.

    개발자로서 우리는 때때로 다음 작품은 "나는 나중에 포맷 할 것이다"라고 뭔가를 만들 수 있지만 나중에 제공하지 않습니다.

    처음에, 우리는이에 대한 SQL 프롬프트 (이 좋았어요)를 사용하지만 무료 도구이기 때문에 다음, ApexSQL 팩터로 전환.

  3. ==============================

    3.나는 파티에 늦게 해요,하지만 난 그냥 책과 매뉴얼에서 배운해야했습니다 내 선호하는 서식 스타일을 추가 할 것입니다 : 컴팩트입니다. 다음은 샘플 SELECT 문의 :

    나는 파티에 늦게 해요,하지만 난 그냥 책과 매뉴얼에서 배운해야했습니다 내 선호하는 서식 스타일을 추가 할 것입니다 : 컴팩트입니다. 다음은 샘플 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 색상은 그들에게 더 나은 경우 소문자), 더 낙타 표기법 (오라클에 무의미), 라인 랩이 필요하지 않을 때.

    업데이트 :

    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)
    

    이제,이 스타일은 그것의 문제가 있음을 인정하는 첫번째가 될 수 있습니다. ORDER BY와 GROUP BY 중 정렬 안 들여 쓰기, 또는 그 자체로 해제하여 단어를 분할하는 8 공간 들여 쓰기 수단. 또한 WHERE 절의 전체 조건을 들여 자연,하지만 것 I 왼쪽 여백에서 일반적으로 정렬 다음 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
    

    이 가증 한 학생이 주어진 기간에 풀 타임 또는 파트 타임인지 여부를 계산합니다. 에 관계없이 스타일, 하드 이것의 읽을.

  4. ==============================

    4.늦은, 그러나 나는 반지에 내 모자를 던질거야. 그것은 조금 더 쓰기에 걸리지 만 나는 패턴이 당신이 그것에 익숙해 일단 아주 쉽게 읽을 수 있도록 수직 정렬로 등장 찾을 수 있습니다.

    늦은, 그러나 나는 반지에 내 모자를 던질거야. 그것은 조금 더 쓰기에 걸리지 만 나는 패턴이 당신이 그것에 익숙해 일단 아주 쉽게 읽을 수 있도록 수직 정렬로 등장 찾을 수 있습니다.

    SELECT ST.ColumnName1,
           JT.ColumnName2,
           SJT.ColumnName3,
           CASE WHEN condition1 = True 
                 AND condition2 = True Then DoSomething
                Else DoSomethingElse
            END ColumnName4
      FROM SourceTable AS ST
     INNER
      JOIN JoinTable AS JT
        ON JT.SourceTableID = ST.SourceTableID
     INNER
      JOIN SecondJoinTable AS SJT
        ON ST.SourceTableID = SJT.SourceTableID
       AND JT.Column3 = SJT.Column4
      LEFT
      JOIN (SELECT Column5
              FROM Table4
           QUALIFY row_number() OVER
                     ( PARTITION BY pField1,
                                    pField2
                           ORDER BY oField1
                     ) = 1
           ) AS subQry
        ON SJT.Column5 = subQry.Column5
     WHERE ST.SourceTableID = X
       AND JT.ColumnName3 = Y
    
  5. ==============================

    5.좋은. 파이썬 프로그래머로서, 여기 내 환경 설정은 다음과 같습니다 :

    좋은. 파이썬 프로그래머로서, 여기 내 환경 설정은 다음과 같습니다 :

    뉴 라인 후이 가독성을 위해 필요한 경우에만에서 어디를 선택합니다.

    코드를보다 컴팩트하고 동등하게 읽을 수 있습니다 때, 나는 보통보다 컴팩트 한 형태를 선호한다. 한 화면에 더 많은 코드에 맞게 수있는 것은 생산성을 향상시킵니다.

    select ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3
    from SourceTable ST
    inner join JoinTable JT
        on JT.SourceTableID = ST.SourceTableID
    inner join SecondJoinTable SJT
        on ST.SourceTableID = SJT.SourceTableID
        and JT.Column3 = SJT.Column4
    where ST.SourceTableID = X and JT.ColumnName3 = Y
    

    궁극적으로,이 코드를 검토 중에 이루어집니다 판단 호출 될 것입니다.

    삽입, 나는 다르게 괄호를 배치합니다 :

    insert into TargetTable (
        ColumnName1,
        ColumnName2,
        ColumnName3)
    values (
        @value1,
        @value2,
        @value3)
    

    이 형식에 대한 이유는 SQL이 (파이썬 등) 블록 구조에 대한 들여 쓰기를 사용하는 경우, 괄호가 필요하지 않을 것입니다. 들여 쓰기가 어쨌든 사용하는 경우에 따라서, 다음 괄호 레이아웃에 최소한의 효과가 있어야합니다. 이것은 라인의 끝에서 그들을 배치함으로써 달성된다.

  6. ==============================

    6.나는 요한의 제안에 따라 다음 스타일을 제안합니다 :

    나는 요한의 제안에 따라 다음 스타일을 제안합니다 :

    /*
    <Query title>
    <Describe the overall intent of the query>
    <Development notes, or things to consider when using/interpreting the query>
    */
    select
        ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
    from 
    
        -- <Comment why this table is used, and why it's first in the list of joins>
        SourceTable ST
    
        -- <Comment why this join is made, and why it's an inner join>
        inner join JoinTable JT
            on ST.SourceTableID = JT.SourceTableID
    
        -- <Comment why this join is made, and why it's an left join>
        left join SecondJoinTable SJT
            on  ST.SourceTableID = SJT.SourceTableID
            and JT.Column3 = SJT.Column4
    
    where
    
        -- comment why this filter is applied
        ST.SourceTableID = X
    
        -- comment why this filter is applied
        and JT.ColumnName3 = (
                select 
                    somecolumn
                from 
                    sometable
            )
    ;
    

    장점 : - 댓글은 코드를 읽을을하고 실수를 검출하는 필수적인 부분입니다. - 왼쪽 가입에 내부에서 변경할 때이 피합니다 실수 가입에 -filters "의"-all- 추가. - 줄 바꿈에 세미콜론을 배치하면 쉽게 추가 / 곳의 주석 절을 수 있습니다.

  7. ==============================

    7.

    SELECT
        a.col1                  AS [Column1]
        ,b.col2                 AS [Column2]
        ,c.col1                 AS [Column3]
    FROM
        Table1 a
        INNER JOIN Table2 b     ON b.Id = a.bId
        INNER JOIN Table3 c     ON c.Id = a.cId
    WHERE
        a.col     = X
        AND b.col = Y
    

    용도 훨씬 더 여기에 많은 예제보다 더 라인,하지만 난 그게 이해하기 훨씬 쉽게 느낀다는, 열 / 절 / 테이블을 신속하게 제거 할 수 있습니다. 그것은 수직 중심의 모니터를 활용하는 데 도움이됩니다.

  8. ==============================

    8.내가 그것을 통해 위의 쿼리를 넣어, 그래서 나는 C #에서 오픈 소스 SQL 포매터 (SQL-서버 전용이 단계에서)을 작성하는 작업입니다.

    내가 그것을 통해 위의 쿼리를 넣어, 그래서 나는 C #에서 오픈 소스 SQL 포매터 (SQL-서버 전용이 단계에서)을 작성하는 작업입니다.

    그것은 각각 '섹션은'그 아래에 들여 쓰기 하위 요소를 가지고 즉 것을, 영업에 비슷한 전략을 사용한다. 필요한 경우, 나는 원조 선명도에 섹션 사이에 공백을 추가 - 더 조인 또는 최소한의 조건이없는 경우이 추가되지 않습니다.

    결과:

    SELECT
        ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
    
    FROM SourceTable ST
    
    INNER JOIN JoinTable JT
            ON JT.SourceTableID = ST.SourceTableID
    
    INNER JOIN SecondJoinTable SJT
            ON ST.SourceTableID = SJT.SourceTableID
           AND ST.SourceTable2ID = SJT.SourceTable2ID
    
    WHERE ST.SourceTableID = X
      AND JT.ColumnName3 = Y
      AND JT.Column3 = SJT.Column4
    
    ORDER BY
        ST.ColumnName1
    
  9. ==============================

    9.나는 심지어 예컨대, 더 몇 단계를 이동하지만, 당신과 비슷한 레이아웃을 사용하는 경향이 :

    나는 심지어 예컨대, 더 몇 단계를 이동하지만, 당신과 비슷한 레이아웃을 사용하는 경향이 :

    select
            ST.ColumnName1
        ,   JT.ColumnName2
        ,   SJT.ColumnName3
    from
                    SourceTable     ST
    
        inner join  JoinTable       JT
            on  JT.SourceTableID    =   ST.SourceTableID
    
        inner join  SecondJoinTable SJT
            on  ST.SourceTableID    =   SJT.SourceTableID
    
    where
            ST.SourceTableID    =   X
        and JT.ColumnName3      =   Y
        and JT.Column3          =   SJT.Column4
    

    아마 처음에는 맨 위에 조금 보이지만, 이럴이 방법으로 도표화의 사용은 SQL의 선언적 성격 주어진 깨끗한, 가장 체계적인 레이아웃을 제공합니다.

    당신은 아마 여기에 대한 답변의 모든 종류하게 될 겁니다. 결국, 그것은 개인 또는 팀 합의 된 환경 설정 아래입니다.

  10. ==============================

    10.이 스레드에서 많은 좋은 점들이있다. 나는 각 열에 전에 같은 줄에 쉼표를 배치합니다 사용에 사람들을 설득하려고 시도되고 있다는 하나 개의 표준. 그래서 같이 :

    이 스레드에서 많은 좋은 점들이있다. 나는 각 열에 전에 같은 줄에 쉼표를 배치합니다 사용에 사람들을 설득하려고 시도되고 있다는 하나 개의 표준. 그래서 같이 :

    Select column1
       ,column2
       ,column3
       ,column4
       ,Column5 ...ect
    

    반대:

    Select column1,
       column2,
       column3, ect...
    

    필요한 경우, 당신이 줄을 주석으로 처리 할 수 ​​있으며,뿐만 아니라 주석되는 해당 쉼표의 계정에서 실행 할 때 쉼표 문제가있을 실 거예요 때문에 나는이 연습을 선호하는 이유입니다. 나는뿐만 아니라 이런 짓을했지만 정말 그것을 지적하지 않은 스레드에서 다른 사용자를 본 것을 알고있다. 대화하지만 내 두 센트에 가져다하지 거대한 계시. 감사

  11. ==============================

    11.조인으로 나는 같은 줄에 ON 키워드를 넣어 것을 제외하고 당신과 비슷한 형식을 사용하고 난 그렇게 내 / 가입 선택 기준의 모든 줄 것을 정중하게 라인의 마지막에 넣어 AND 및 OR 연산자.

    조인으로 나는 같은 줄에 ON 키워드를 넣어 것을 제외하고 당신과 비슷한 형식을 사용하고 난 그렇게 내 / 가입 선택 기준의 모든 줄 것을 정중하게 라인의 마지막에 넣어 AND 및 OR 연산자.

    내 스타일 존 Sansom의 유사하지만, 내가 퍼팅에 대한 동의는 WHERE 절에 조건을 가입 할 수 있습니다. 나는 그것이 조직되어 쉽게 찾을 수 있도록이 조인 된 테이블과 함께해야한다고 생각합니다.

    또한 짧은 문장, 나는 그냥 원래 줄에 괄호를 유지할 수 있지만, 그 위에 라인과 그 다음 줄에 들여 쓰기로 정렬 신규 라인에 괄호를 넣어하는 경향이있다. 예를 들면 :

    SELECT
         my_column
    FROM
         My_Table
    WHERE
         my_id IN
         (
              SELECT
                   my_id
              FROM
                   Some_Other_Table
              WHERE
                   some_other_column IN (1, 4, 7)
         )
    

    CASE 문, 나는 언제와 ELSE 각각의 새로운 라인 들여 쓰기를주고, 나는 CASE에 대한 최종 다시 정렬 :

    CASE
         WHEN my_column = 1 THEN 'one'
         WHEN my_column = 2 THEN 'two'
         WHEN my_column = 3 THEN 'three'
         WHEN my_column = 4 THEN 'four'
         ELSE 'who knows'
    END
    
  12. ==============================

    12.나는이 논쟁에 매우 늦게 오전 실현,하지만 난 내 생각을주고 싶습니다. 나는 라인의 시작 부분에 쉼표 찬성 확실히입니다. 당신이 아담 랄프 말처럼, 필드을 주석 쉽게하고 또한 그들이 처음에있을 때 이것은 큰 문제 같은 소리하지 않는 동안, 실수로 쉼표를 놓치고 더 어렵다 찾을 수 있습니다. 나는 (나는 확신 당신 중 일부는 아마뿐만 아니라 이런 짓을했는지) 나는 실수로 줄 끝에 쉼표를 놓친 긴 T-SQL 절차에서 실수 구문 오류를 추적하려고 과거의 시간을 보냈습니다 . 나는 가능한 한 많이 앨리어싱 찬성도 해요.

    나는이 논쟁에 매우 늦게 오전 실현,하지만 난 내 생각을주고 싶습니다. 나는 라인의 시작 부분에 쉼표 찬성 확실히입니다. 당신이 아담 랄프 말처럼, 필드을 주석 쉽게하고 또한 그들이 처음에있을 때 이것은 큰 문제 같은 소리하지 않는 동안, 실수로 쉼표를 놓치고 더 어렵다 찾을 수 있습니다. 나는 (나는 확신 당신 중 일부는 아마뿐만 아니라 이런 짓을했는지) 나는 실수로 줄 끝에 쉼표를 놓친 긴 T-SQL 절차에서 실수 구문 오류를 추적하려고 과거의 시간을 보냈습니다 . 나는 가능한 한 많이 앨리어싱 찬성도 해요.

    전반적으로, 그러나, 나는 그것이 일부는 다른 사람을 위해하지 않습니다에 대한 어떤 작품, 개인적인 취향에 대한 모든 다운 실현. 만큼 당신이 쉽게 코드와 각 개발자 프로그램 전반에 걸쳐 자신의 스타일로 일부 일관성을 읽을 수있는, 그게 가장 중요하다고 생각합니다.

  13. ==============================

    13.이것은 내 개인 SQL 스타일 가이드입니다. 그것은 다른 사람의 몇 기반으로하지만 몇 주 문체의 기능을 가지고 있습니다 - 소문자 키워드, 아니없는 키워드 (예를 들어 외부, 내부, ASC), 그리고 "강".

    이것은 내 개인 SQL 스타일 가이드입니다. 그것은 다른 사람의 몇 기반으로하지만 몇 주 문체의 기능을 가지고 있습니다 - 소문자 키워드, 아니없는 키워드 (예를 들어 외부, 내부, ASC), 그리고 "강".

    예 SQL은 다음과 같습니다 :

    -- basic select example
    select p.Name as ProductName
         , p.ProductNumber
         , pm.Name as ProductModelName
         , p.Color
         , p.ListPrice
      from Production.Product as p
      join Production.ProductModel as pm
        on p.ProductModelID = pm.ProductModelID
     where p.Color in ('Blue', 'Red')
       and p.ListPrice < 800.00
       and pm.Name like '%frame%'
     order by p.Name
    
    -- basic insert example
    insert into Sales.Currency (
        CurrencyCode
        ,Name
        ,ModifiedDate
    )
    values (
        'XBT'
        ,'Bitcoin'
        ,getutcdate()
    )
    
    -- basic update example
    update p
       set p.ListPrice = p.ListPrice * 1.05
         , p.ModifiedDate = getutcdate()
      from Production.Product p
     where p.SellEndDate is null
       and p.SellStartDate is not null
    
    -- basic delete example
    delete cc
      from Sales.CreditCard cc
     where cc.ExpYear < '2003'
       and cc.ModifiedDate < dateadd(year, -1, getutcdate())
    
  14. ==============================

    14.아직 아무도 완료 공통 테이블 식 (CTE를). 아래는 제가 사용하는 몇 가지 다른 스타일과 함께 그것을 통합 :

    아직 아무도 완료 공통 테이블 식 (CTE를). 아래는 제가 사용하는 몇 가지 다른 스타일과 함께 그것을 통합 :

    declare @tableVariable table (
        colA1 int,
        colA2 int,
        colB1 int,
        colB2 nvarchar(255),
        colB3 nvarchar(255),
        colB4 int,
        colB5 bit,
        computed int
    );
    
    with
    
        getSomeData as (
    
            select        st.colA1, sot.colA2
            from          someTable st
            inner join    someOtherTable sot on st.key = sot.key
    
        ),
    
        getSomeOtherData as (
    
            select        colB1, 
                          colB2, 
                          colB3,
                          colB4,
                          colB5,
                          computed =    case 
                                        when colB5 = 1 then 'here'
                                        when colB5 = 2 then 'there'
                                        end
            from          aThirdTable tt
            inner hash 
             join         aFourthTable ft
                          on tt.key1 = ft.key2
                          and tt.key2 = ft.key2
                          and tt.key3 = ft.key3
    
        )
    
        insert      @tableVariable (
                        colA1, colA2, colA2, 
                        colB1, colB2, colB3, colB4, colB5, 
                        computed 
                    )
        select      colA1, colA2, 
                    colB1, colB2, colB3, colB4, colB5, 
                    computed 
        from        getSomeData data1
        join        getSomeOtherData data2
    

    열팽창 계수 형식에 몇 가지 포인트 :

    이 시뮬레이션합니다 :

    func getSomeData() {
    
        select        st.colA1, sot.colA2
        from          someTable st
        inner join    someOtherTable sot on st.key = sot.key
    
    }
    

    열팽창 계수 형식 외에 몇 가지 포인트 :

    나는 좀 더 다른 지역에 비해 내 CTE 스타일에 정착하고 있음을 찾을 수 있습니다. 문제 제기 것과 더 유사 스타일로 실험하지 않았습니다. 아마 언젠가을하고 내가 좋아하는 방법을 볼 수 있습니다. 아마 그것을 가지고 재미 저주 비록, 그것은 선택의 환경에있을 저주하고있다.

  15. ==============================

    15.이미 작성된 T-SQL를 변경하고있는 경우 (있는 경우), 그때는 이미 사용 규칙을 따릅니다.

    이미 작성된 T-SQL를 변경하고있는 경우 (있는 경우), 그때는 이미 사용 규칙을 따릅니다.

    나는 처음부터 쓰고 또는 어떤 규칙이없는 경우 나 키워드에 대한 대문자 (읽기 쉽 단지 개인적인 취향)를 사용하는 것을 선호 제외하고, 그때, 국제 대회 질문에 주어진 팔로우하는 경향이있다.

    나는 SQL은 다른 코드 형식의 규칙과 같은 포맷으로 생각하는, 중요한 점은 규칙을 가지고있다, 아니 그 규칙이 무엇인지 (물론 상식의 영역 내에서!)

  16. ==============================

    16.그래 좀 rigourously 정의 된 방식으로 SQL을 레이아웃의 가치, 그러나 확실하게 이름 지정 규칙을 볼 수 있고 의도가 훨씬 더 중요하다. 10 배 더 중요처럼.

    그래 좀 rigourously 정의 된 방식으로 SQL을 레이아웃의 가치, 그러나 확실하게 이름 지정 규칙을 볼 수 있고 의도가 훨씬 더 중요하다. 10 배 더 중요처럼.

    우리가 그들에게있는 거 테이블과 SP의 알 - 내 애완 동물 혐오가 SP는 접두사 TBL 접두사 테이블 및 저장 프로 시저 것을 기준으로합니다. DB 객체의 명명은 얼마나 많은 공백이보다 훨씬 더 중요하다

    그냥 내 $ 0.02 worths

  17. ==============================

    17.나는 SSMS에서 레드 게이트 SQL 리팩토링을 사용하지만, reformating (및 SSMS를 대체) 않는 다른 도구는 에이펙스의 SQL 편집이다. 당신이 게시물에 코드를 찾고 있다면 온라인 간단한 대화를 SQL Prettifier이 있습니다.

    나는 SSMS에서 레드 게이트 SQL 리팩토링을 사용하지만, reformating (및 SSMS를 대체) 않는 다른 도구는 에이펙스의 SQL 편집이다. 당신이 게시물에 코드를 찾고 있다면 온라인 간단한 대화를 SQL Prettifier이 있습니다.

  18. ==============================

    18.내가 좋아하는 :

    내가 좋아하는 :

    SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3 --leave all selected columns on the same line
    FROM 
        SourceTable ST
    INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID
    INNER JOIN SecondJoinTable SJT --only splitting lines when more than 1 condition
        ON ST.SourceTableID = SJT.SourceTableID
        AND JT.Column3 = SJT.Column4
    WHERE
        ST.SourceTableID = X
        and JT.ColumnName3 = Y
    

    작은보기 영역에 더 많은 코드를 얻을 수 있습니다. 또한 키워드는 대문자로해야한다고 생각

  19. ==============================

    19.서로 다른 의견의 수는 무섭다. 이것은 내 조직에서 사용하는 것입니다 :

    서로 다른 의견의 수는 무섭다. 이것은 내 조직에서 사용하는 것입니다 :

     SELECT ST.ColumnName1,
            JT.ColumnName2,
            SJT.ColumnName3
       FROM SourceTable ST
      INNER JOIN JoinTable JT ON JT.SourceTableID = ST.SourceTableID
      INNER JOIN SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID 
            AND JT.Column3 = SJT.Column4
      WHERE ST.SourceTableID = X
        AND JT.ColumnName3 = Y
    

    8 글자 들여 쓰기를 유지하는 것은 가독성 이럴 열쇠입니다.

  20. ==============================

    20.나는 당신의 프로젝트 내에서 일반적으로 서식 SQL을 표준화하기위한 당신의 노력으로 전체 진심으로 동의합니다.

    나는 당신의 프로젝트 내에서 일반적으로 서식 SQL을 표준화하기위한 당신의 노력으로 전체 진심으로 동의합니다.

    나는 또한 매우 당신의 서식 선택에 동의합니다. 나는 또한 '참여'문을 들여 저장, 거의 같은 일을 마련, 그리고 그들에게 하나 개 더 들여 쓰기 문 '에'.

    당신 그 소리 쳤다 OUT이다 싶어 - 아주 많은 키워드에 소문자 가고 있다는 사실있다. 가독성 만든다 - 나는 또한 사례 테이블 별칭을 절감하는 것을 선호

    대단히 작은 들여 쓰기 (4)를 사용한다는 사실있다. 나는 (3)과 함께 할 것입니다.

    I는 용어 "내적"를 다음과 같은 '외부'불필요한 닉스.

    다음은 SELECT 문을 포맷했을 방법입니다

    select
       st.ColumnName1,
       jt.ColumnName2,
       sjt.ColumnName3
    from 
       SourceTable st
       join JoinTable jt on jt.SourceTableID = st.SourceTableID
       join SecondJoinTable sjt on
          st.SourceTableID = sjt.SourceTableID and
          jt.Column3 = sjt.Column4
    where
       st.SourceTableID = X
       and jt.ColumnName3 = Y
    ;
    

    이 논의 주셔서 감사합니다.

  21. ==============================

    21.이것은 내가 사용하는 형식입니다. 의견은 더 나은 만들 수 있습니다하십시오.

    이것은 내가 사용하는 형식입니다. 의견은 더 나은 만들 수 있습니다하십시오.

    CREATE PROCEDURE [dbo].[USP_GetAllPostBookmarksByUserId]
        @id INT,
        @startIndex INT,
        @endIndex INT
    AS
    BEGIN
    
        SET NOCOUNT ON
    
        SELECT      *
        FROM
                (   SELECT      ROW_NUMBER() OVER ( ORDER BY P.created_date ) AS row_num, P.post_id, P.title, P.points, p.estimated_read_time, P.view_count, COUNT(1) AS "total_attempts" -- todo
                    FROM        [dbo].[BOOKMARKED] B
                    INNER JOIN  [dbo].[POST] P
                    ON          B.entity_id = P.post_id
                    INNER JOIN  [dbo].[ATTEMPTED] A
                    ON          A.entity_id = P.post_id
                    WHERE       B.user_id = 1 AND P.is_active = 1
                    GROUP BY    P.post_id, P.title, P.points, p.estimated_read_time, P.view_count
                )   AS PaginatedResult
        WHERE       row_num >= @startIndex
        AND         row_num < @endIndex
        ORDER BY    row_num
    
    END
    
  22. ==============================

    22.내 대답 11:05에 2월 6일 '09 대답 존 Sansom에 의해 허용 대답과 유사합니다. 레드 게이트에서 프롬프트 SQL와 그의 대답에 반대하지만, 나는 ++ 메모장에서 SQLInForm 플러그인을 사용하여 몇 가지 서식 옵션을 시연 할 예정이다.

    내 대답 11:05에 2월 6일 '09 대답 존 Sansom에 의해 허용 대답과 유사합니다. 레드 게이트에서 프롬프트 SQL와 그의 대답에 반대하지만, 나는 ++ 메모장에서 SQLInForm 플러그인을 사용하여 몇 가지 서식 옵션을 시연 할 예정이다.

    SQLInForm 플러그인은 설치 할 수있는 5 개 가지 프로파일을 가지고있다. 프로파일 내에서 무료 및 유료 버전 모두에서 사용할 수있는 설정 많이 있습니다. 완전한 목록은 아래에 당신은 온라인으로 플러그인 - 도움말 - 일반 옵션 페이지를 볼 수 있습니다.

    대신 내 환경 설정에 대해 두서의 나는 SQLInForm 옵션을 사용할 제시하는 것이 유용 할 것이다 고려했다. 내 환경 설정 중 일부는 아래에 설명되어 있습니다. 내 게시물의 끝에서 포맷 된 SQL 코드가 원래의 게시물에 사용되는 (원본 VS는 VS의 format2를 포맷 1).

    나는 몇 가지의 소수 것 같다 here-- 다른 답변을 통해 읽기. 주요 쉼표 (여기에 짧은 비디오)와 같은 내가 - IMO, 새로운 필드가 선택 될 때 훨씬 더 쉽게 읽을 수 있습니다. 또한 나는 LINEBREAK로하지 옆에 SELECT 내 열 1을 좋아합니다.

    다음은 SELECT 문을 고려 내 환경 설정 노트의 일부에 대한 개요입니다. 나는 모든 (13 개) 섹션의 스크린 샷을 추가합니다; 하지만 그 스크린 샷을 많이하고 난 그냥 형식 컨트롤을 스크린 샷을 걸릴 무료 edition-- 당신을 격려하고, 테스트 것입니다. 나는 곧 프로 버전을 테스트 할 것입니다; 정말 도움이되고 단지 $ 20가 될 것 같은하지만 옵션에 따라이 보인다.

    원래 쿼리 형식입니다.

    select
        ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
    from 
        SourceTable ST
    inner join JoinTable JT
        on JT.SourceTableID = ST.SourceTableID
    inner join SecondJoinTable SJT
        on ST.SourceTableID = SJT.SourceTableID
        and JT.Column3 = SJT.Column4
    where
        ST.SourceTableID = X
        and JT.ColumnName3 = Y
    

    희망 전환 FORMAT (옵션 # 1 : 더 LINEBREAK 가입 없음)

    SELECT
        ST.ColumnName1
        , JT.ColumnName2
        , SJT.ColumnName3
    FROM
        SourceTable ST
        inner join JoinTable JT 
            on JT.SourceTableID = ST.SourceTableID
        inner join SecondJoinTable SJT
            on ST.SourceTableID = SJT.SourceTableID
            and JT.Column3      = SJT.Column4
    WHERE
        ST.SourceTableID   = X
        and JT.ColumnName3 = Y
    

    희망 전환 FORMAT (옵션 # 2 : LINEBREAK에 가입)

    SELECT  
        ST.ColumnName1
        , JT.ColumnName2
        , SJT.ColumnName3
    FROM
        SourceTable ST
        inner join
            JoinTable JT
            on JT.SourceTableID = ST.SourceTableID
        inner join
            SecondJoinTable SJT
            on ST.SourceTableID = SJT.SourceTableID
            and JT.Column3      = SJT.Column4
    WHERE
        ST.SourceTableID   = X
        and JT.ColumnName3 = Y
    

    도움이 되었기를 바랍니다.

  23. ==============================

    23.내 SQL 같은 그래도 한 의도가 쉽게 읽을 수있는 한, 대부분의 모든 형식이 작동합니다, 그래서 같은 형식합니다. 나는 정말 방법이 있음을 왼쪽으로 다음 쿼리 디자이너에서 생성 문을보고 싫어. 나는 등 다른 사람 절차 /보기 / 기능 / 트리거를 편집하고, 내가 (정말 나쁜 않는 한, 나는이 모든 일을 포맷합니다)에 이미 사용 된 서식을 유지하려고합니다.

    내 SQL 같은 그래도 한 의도가 쉽게 읽을 수있는 한, 대부분의 모든 형식이 작동합니다, 그래서 같은 형식합니다. 나는 정말 방법이 있음을 왼쪽으로 다음 쿼리 디자이너에서 생성 문을보고 싫어. 나는 등 다른 사람 절차 /보기 / 기능 / 트리거를 편집하고, 내가 (정말 나쁜 않는 한, 나는이 모든 일을 포맷합니다)에 이미 사용 된 서식을 유지하려고합니다.

    Select 문

    SELECT ST.ColumnName1, JT.ColumnName2, SJT.ColumnName3
      FROM SourceTable ST INNER JOIN
           JoinTable JT ON JT.SourceTableID = ST.SourceTableID 
           INNER JOIN
           SecondJoinTable SJT ON ST.SourceTableID = SJT.SourceTableID
                              AND JT.Column3 = SJT.Column4
    WHERE (ST.SourceTableID = X)
      AND (JT.ColumnName3 = Y);
    

    UPDATE 문

    UPDATE TargetTable SET
           ColumnName1 = @value,
           ColumnName2 = @value2
     WHERE (Condition1 = @test);
    

    삽입 문

    INSERT INTO TargetTable 
               (
                 ColumnName1,
                 ColumnName2,
                 ColumnName3
               ) 
               values 
               (
                 @value1,
                 @value2,
                 @value3
               );
    
  24. ==============================

    24.난 당신이 쉽게 파악하고 수정 버그 수 있기 때문에 서식 좋은을 가진 규칙이 정말 중요하다고 생각합니다. 그것의 말처럼 - 항상 좋은 서식에 약간의 시간을 보낼 수 있도록, "넌 코드를 작성 한 번,이 코드는 10000000 번으로 읽습니다." 주요 목표는 :

    난 당신이 쉽게 파악하고 수정 버그 수 있기 때문에 서식 좋은을 가진 규칙이 정말 중요하다고 생각합니다. 그것의 말처럼 - 항상 좋은 서식에 약간의 시간을 보낼 수 있도록, "넌 코드를 작성 한 번,이 코드는 10000000 번으로 읽습니다." 주요 목표는 :

    일부 규칙은 항상 사용

    예를 들어, 여기에 내가이 문제의 예제로 사용 쿼리의 형식을 줄 방법 ​​:

    select
        ST.ColumnName1,
        JT.ColumnName2,
        SJT.ColumnName3
    from <schema>.SourceTable as ST
        inner join <schema>.JoinTable as JT on
            ST.SourceTableID = JT.SourceTableID
        inner join <schema>.SecondJoinTable as SJT on
            SJT.SourceTableID = ST.SourceTableID and
            SJT.Column4 = JT.Column3
    where
        ST.SourceTableID = X and
        JT.ColumnName3 = Y
    

    그리고 "학생"쿼리 :

    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
            a.term,
            a.student_id,
            pm.credits as ft_credits,
            pm.[hours] as ft_hours_per_week,
            sum(a.credits) as credits,
            sum(a.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 pe.student_id = e.student_id and pe.term = e.term and pe.offering_id = e.offering_id
            where
                e.registration_code Not in ('A7', 'D0', 'WL')
        ) as a
            inner join student_history as sh using (student_id)
            inner join program_major as pm on pm._major_code = sh.major_code_1 and pm.division_code = sh.division_code_1
        where
            sh.eff_term = 
                (
                    select max(eff_term)
                    from student_history as shi
                    where
                        shi.student_id = sh.student_id and
                        shi.eff_term <= term
                 )
        group by
            a.term,
            a.student_id,
            pm.credits,
            pm.[hours]
    ) as a
    order by
        term,
        student_id
    
  25. ==============================

    25.나의 선호하는 스타일 :

    나의 선호하는 스타일 :

    SELECT
      ST.ColumnName1,
      JT.ColumnName2,
      SJT.ColumnName3
    FROM
      SourceTable ST
    INNER JOIN
      JoinTable JT
    ON
      JT.SourceTableID = ST.SourceTableID
    INNER JOIN
      SecondJoinTable SJT
    ON
      ST.SourceTableID = SJT.SourceTableID
    WHERE
      ST.SourceTableID = X
    AND
      JT.ColumnName3 = Y
    AND
      JT.Column3 = SJT.Column4
    
  26. ==============================

    26.

    SELECT st.ColumnName1
          ,jt.ColumnName2
          ,sjt.ColumnName3
    FROM   SourceTable st
    JOIN   JoinTable jt ON jt.SourceTableID = st.SourceTableID
    JOIN   SecondJoinTable sjt ON SstT.SourceTableID = sjt.SourceTableID
                                  AND jt.Column3 = sjt.Column4
    WHERE  st.SourceTableID = X
           AND jt.ColumnName3 = Y
    

    나는 액션 단어를 모두 대문자를 사용하여 조인 절, 그들은 더 눈에 띄는. INNER이 INNER이 기입 할 필요가 없습니다 있도록 가입으로 가입 쓰기 OUTER은 JOIN 또는 당신이 그것을 필요로 할 때 왼쪽 가입, 그것은 가정한다 동일합니다. 나는 또한 내 별명에 대한 lowere 케이스를 사용합니다. 전면 원인 밖으로 공통 당신은 마지막 열 위 쉼표로 붙어 쿼리가 실패를 주석 처리합니다.

  27. ==============================

    27.여기에 백 답변 이미,하지만 훨씬 toing 후 수년에 걸쳐 froing, 이것은 내가에 정착 한 것입니다 :

    여기에 백 답변 이미,하지만 훨씬 toing 후 수년에 걸쳐 froing, 이것은 내가에 정착 한 것입니다 :

    SELECT      ST.ColumnName1
              , JT.ColumnName2
              , SJT.ColumnName3
    
    FROM        SourceTable       ST
    JOIN        JoinTable         JT  ON  JT.SourceTableID  =  ST.SourceTableID
    JOIN        SecondJoinTable  SJT  ON  ST.SourceTableID  =  SJT.SourceTableID
                                      AND JT.Column3        =  SJT.Column4
    
    WHERE       ST.SourceTableID  =  X
    AND         JT.ColumnName3    =  Y
    

    나는 하나의 여분의 표는 코드의 재 들여 쓰기 많은 라인에 저를 일으킬 수 있기 때문에이 지저분 차이점에 대해 할 수 있습니다 알고 있지만처럼 읽기의 내 용이합니다.

  28. ==============================

    28.안하는 것보다 늦게하는 것이 낫다. 나는 다른 스타일을 사용하고 내가 함께 작업에 사용되는 아주 좋은 SQL 개발자에서을 채택했다. I 오른쪽 정렬 키워드와 I는 입력의 편의를 위해 대문자 문자를 사용하지 마십시오. 키워드 에디터에 의해 강조되고 당신이 키워드 강조 기능을 지원하지 않습니다 텍스트 편집기에서 편집을 많이하지 않는 한 그들을 대문자로 위해 내가 필요 표시되지 않습니다. 나는 소형, 오히려 더 읽기와 가능한 한 수직으로 정렬 만들려고하지 않습니다. 여기가 내 형식으로 작성 @BenLaan 답에서 가져온 선택의 예입니다 :

    안하는 것보다 늦게하는 것이 낫다. 나는 다른 스타일을 사용하고 내가 함께 작업에 사용되는 아주 좋은 SQL 개발자에서을 채택했다. I 오른쪽 정렬 키워드와 I는 입력의 편의를 위해 대문자 문자를 사용하지 마십시오. 키워드 에디터에 의해 강조되고 당신이 키워드 강조 기능을 지원하지 않습니다 텍스트 편집기에서 편집을 많이하지 않는 한 그들을 대문자로 위해 내가 필요 표시되지 않습니다. 나는 소형, 오히려 더 읽기와 가능한 한 수직으로 정렬 만들려고하지 않습니다. 여기가 내 형식으로 작성 @BenLaan 답에서 가져온 선택의 예입니다 :

    select st.ColumnName1
           , jt.ColumnName2
           , sjt.ColumnName3
      from SourceTable st
             inner join
           JoinTable jt
             on jt.SourceTableID = st.SourceTableID
             inner join
           SecondJoinTable sjt
             on st.SourceTableID = sjt.SourceTableID
             and st.SourceTable2ID = sjt.SourceTable2ID
     where st.SourceTableID = X
           and jt.ColumnName3 = Y
           and jt.Column3 = sjt.Column4
     order by st.ColumnName1
    

    같은 서식 패턴을 따르는 모든 팀을 준수하기 위해 노력하는 것은 어려운 일이다. 다른 사람들이 같은 방식을 따른다면 나는 어떤 형식을 따를 것입니다,하지만 같은 이야기 적이있다.

    최신 정보: 이전 글에서 언급 한 복잡한 쿼리 중 하나를 다시 쓰기 :

    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
    
  29. ==============================

    29.그것은 단지 800 × 600을 지원하는 모니터에서 계속 일을 당신의 대부분을 나타납니다. 나는 오른쪽으로 모든 공간을 사용할 수 있도록 내 모니터는 1920 × 1080 할 것입니다.

    그것은 단지 800 × 600을 지원하는 모니터에서 계속 일을 당신의 대부분을 나타납니다. 나는 오른쪽으로 모든 공간을 사용할 수 있도록 내 모니터는 1920 × 1080 할 것입니다.

    이건 어때요:

    select col1, col2, col3
    , case when x = 1 then 'answer1'
           else 'answer2'
      end
    , col4, col5, col6, col7
    from table1 t1
    inner join table2 t2 on t1.col1 = t2.col1 and t1.col2 and t2.col2
    where t1.col5 = 19 and t1.col7 = 'Bill Gates'
    
  30. from https://stackoverflow.com/questions/519876/sql-formatting-standards by cc-by-sa and MIT license