Wcięcie w instrukcji SQL dobra praktyka [zamknięte]

Jaka jest akceptowana praktyka wcinania wyrażeń SQL? Na przykład rozważ następujące polecenie SQL:

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
FROM table2
INNER JOIN table3
ON table2.column1 = table3.column1
)

Jak to powinno być wcięte? Wielkie dzięki.

Author: Mihai Limbășan, 2008-11-07

25 answers

SELECT column1
     , column2
FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3
    ON table2.column1 = table3.column1
)

Lubię mieć wszystkie ", " z przodu , w ten sposób nigdy nie przeszukuję ich, gdy błąd w linii X z edytora SQL.


Jest to przykład dla tych, którzy nie używają tego typu zapisu instrukcji SQL. Oba zawierają błąd braku przecinka.

SELECT sdcolumn123
 , dscolumn234
 , sdcolumn343
 , ffcolumn434
 , sdcolumn543
 , bvcolumn645
  vccolumn754
 , cccolumn834
 , vvcolumn954
 , cvcolumn104
FROM table1
WHERE column3 IN
(
    ...
)

SELECT sdcolumn123, dscolumn234, asdcolumn345, dscolumn456, ascolumn554, gfcolumn645 sdcolumn754, fdcolumn845, sdcolumn954, fdcolumn1054
FROM table1
WHERE column3 IN
(
    ...
)

Znalazłem łatwiejsze i szybsze w pierwszym przykładzie. Mam nadzieję, że ten przykład pokaże wam więcej mojego punktu widzenia.

 40
Author: Patrick Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 19:40:32
SELECT column1, column2
FROM table
WHERE column3 IN (
    SELECT TOP(1) column4
    FROM table2
    INNER JOIN table3 ON table2.column1 = table3.column1
)

To jest dość krótkie i łatwe do odczytania. Dokonałbym korekt, gdyby wybrano więcej kolumn lub więcej warunków łączenia.

 24
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:30:47

Nie jestem pewien czy istnieje akceptowana praktyka, ale oto jak bym to zrobił:

SELECT 
    column1, 
    column2 
FROM 
    table1 
WHERE 
    column3 IN 
    ( 
     SELECT TOP(1) 
         column4 
     FROM 
         table2 
         INNER JOIN 
         table3 
             ON table2.column1 = table3.column1 
    )
 20
Author: Codewerks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:31:20

Lubię mieć "rzeki" Białej spacji w kodzie. Ułatwia to skanowanie.

SELECT column1,
       column2
  FROM table1
 WHERE column3 IN (SELECT column4
                     FROM table2
                     JOIN table3
                       ON table2.column1 = table3.column1);
 20
Author: jalbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:41:01

Podoba mi się forma jalberta ułożenia słów kluczowych po prawej stronie. Dodam jeszcze, że lubię ANDs i ORs po lewej stronie (niektórzy umieszczają je po prawej.) Ponadto Lubię ustawiać swoje znaki równości, gdy jest to możliwe.


SELECT column1, 
       column2  
  FROM table1, table2 
 WHERE table1.column1 = table2.column4 
   AND table1.col5    = "hi" 
    OR table2.myfield = 678 
 17
Author: Slapout,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 15:03:44

To moja osobista metoda. W zależności od długości warunku łączenia czasami wciskam go na poniższej linii.

SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3 ON table2.column1 = table3.column1
  )


SELECT
  column1,
  column2
FROM
  table1
WHERE
  column3 IN ( 
    SELECT TOP(1)
      column4
    FROM
      table2
      INNER JOIN table3
        ON table2.column1 = table3.column1 -- for long ones
  )
 10
Author: LeppyR64,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:30:42

Napisałem standard kodu dla naszego sklepu, który jest stronniczy w skrajnym kierunku czytelności/ "odkrywalności" (ta ostatnia jest przede wszystkim przydatna w wyrażeniach insert-select):

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2
            INNER JOIN table3 ON table2.column1 = table3.column1
    )

Przy bardziej złożonych zapytaniach staje się bardziej oczywiste, jak jest to przydatne:

SELECT
    Column1,
    Column2,
    Function1
    (
        Column1,
        Column2
    ) as Function1,
    CASE
    WHEN Column1 = 1 THEN
        a
    ELSE
        B
    END as Case1       
FROM
    Table1 t1
    INNER JOIN Table2 t2 ON t1.column12 = t2.column21
WHERE
    (
        FilterClause1
        AND FilterClause2
    )
    OR
    (
        FilterClause3
        AND FilterClause4
    )

Po przejściu do systemów z więcej niż jednym połączeniem w większości zapytań, z mojego doświadczenia wynika, że korzystanie z pionowej przestrzeni liberalnie jest twoim najlepszym przyjacielem ze złożonym SQL.

 7
Author: Mike Burton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 15:17:27

Jeśli masz długie polecenie SQL, które chcesz sformatować bez wpisywania i zakładania kart, możesz umieścić je w na tej stronie i uzyskać ładnie sformatowany wynik. Możesz eksperymentować z różnymi formatami, aby zobaczyć, co sprawia, że tekst jest najbardziej czytelny.

Edit: wierzę, że to {[2] } jest lokalizacją 2014 formatera SQL.

 7
Author: DOK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-26 17:39:37

Formatowanie SQL jest obszarem, w którym istnieje wiele wariancji i nieporozumień... Ale fwiw, Lubię skupiać się na czytelności i myślę, że cokolwiek robisz, konsekwentne przestrzeganie wszelkich zasad, które zmniejszają czytelność, jest, jak mówi Stary banał, "głupią konsekwencją" ("głupia konsystencja jest hobgoblinem dla prostych umysłów") {]}

Więc zamiast nazywać je regułami, oto kilka wskazówek. Dla każdej głównej klauzuli w instrukcji SQL (Select, Insert, Delete, From, Where, Having, Group BY, Order By,... Może brakuje kilku) powinny być łatwo rozpoznawalne. Więc generalnie wciąłem je na najwyższym poziomie, wszystkie nawet ze sobą. Następnie w ramach każdej klauzuli równomiernie wcinam następną logiczną podbudowę... i tak dalej.. Ale czuję się swobodnie (i często) zmienić wzór, jeśli w każdym indywidualnym przypadku byłoby to bardziej czytelne... Dobrym przykładem są złożone deklaracje przypadków. Ponieważ wszystko co wymaga poziomego przewijania ogromnie zmniejsza czytelność, często zapisuje złożone (zagnieżdżone) wyrażenia Case w wielu wierszach. Kiedy to robię, staram się, aby początek takiego polecenia zawieszał się na podstawie jego logicznego miejsca w instrukcji SQL, a resztę wierszy instrukcji wcięło kilka znaków dalej...

Kod bazy danych SQL istnieje od dawna, odkąd komputery miały małe litery, więc istnieje historyczna preferencja dla słów kluczowych o górnej obudowie, ale wolę czytelność niż tradycję... (i każde narzędzie używam kodów kolorów słowa kluczowe teraz w każdym razie)

Użyłbym również aliasów tabel, aby zmniejszyć ilość tekstu, który oko musi skanować, aby poprawić strukturę zapytania, o ile aliasy nie powodują zamieszania. W zapytaniu z mniej niż 3 lub 4 tabel aliasy pojedynczych znaków są w porządku, często używam pierwszej litery tabeli, jeśli wszystkie tabele zaczynają się od innej litery... ponownie, co najbardziej przyczynia się do czytelności. Wreszcie, jeśli twoja baza danych GO obsługuje, wiele słów kluczowych to opcjonalne (np." Wewnętrzne"," Zewnętrzne"," As " dla aliasów itp.) "Into" (od Insert Into) jest opcjonalne na Sql Server-ale nie na Oracle) więc uważaj na używanie tego, jeśli twój kod musi być niezależny od platformy...

Twój przykład, napiszę jako:

Select column1, column2
From table1 T1
Where column3 In (Select Top(1) column4
                  From table2 T2
                     Join table3 T3
                         On T2.column1 = T3.column1)

Lub

Select column1, column2
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

Jeśli w klauzuli select jest więcej kolumn, wciąłbym drugą i kolejne linie... Generalnie nie przestrzegam żadnych ścisłych (jedna kolumna w wierszu) reguł, ponieważ przewijanie veritcally jest prawie tak źle dla czytelności, jak przewijanie w poziomie, zwłaszcza jeśli tylko pierwsze dziesięć kolumn ekranu ma w sobie tekst)

Select column1, column2, Col3, Col4, column5,
    column6, Column7, isNull(Column8, 'FedEx') Shipper,
    Case Upper(Column9) 
       When 'EAST'  Then 'JFK'
       When 'SOUTH' Then 'ATL'
       When 'WEST'  Then 'LAX'
       When 'NORTH' Then 'CHI' End HubPoint
From table1 T1
Where column3 In 
     (Select Top(1) column4
      From table2 T2
         Join table3 T3
            On T2.column1 = T3.column1)

Sformatuj kod w dowolny sposób, który czyni go najbardziej czytelnym...

 6
Author: Charles Bretana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 17:44:48

Lubię mieć różne części mojego zapytania w linii pionowej. Zazwyczaj używam tabulatora o rozmiarze 8 spacji dla SQL, który wydaje się działać dobrze.

SELECT  column1, 
        column2
FROM    table1
WHERE   column3 IN
(
        SELECT TOP(1) column4
        FROM    table2
        INNER JOIN table3
        ON      table2.column1  = table3.column1
)
 5
Author: Jack Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:44:48

Przykład wcięć bardzo bardzo skomplikowanego SQL:

SELECT 
    produtos_cesta.cod_produtos_cesta, 
    produtos.nome_pequeno,
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r AS sku_kit, 
    sku_final = CASE
        WHEN produtos_kits.sku_r IS NOT NULL THEN produtos_kits.sku_r
        ELSE produtos_cesta.sku
    END,
    estoque = CASE
        WHEN produtos2.estoque IS NOT NULL THEN produtos2.estoque
        ELSE produtos.estoque
    END,
    produtos_cesta.unidades as unidades1, 
    unidades_x_quantidade = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN CAST(produtos_cesta.quantidade * (produtos_cesta.unidades / tab_contagem.cont) * produtos_kits.quantidade AS int)
        ELSE CAST(produtos_cesta.quantidade * produtos_cesta.unidades AS int)
    END,
    unidades = CASE
        WHEN produtos.cod_produtos_kits_tipo = 1 THEN produtos_cesta.unidades / tab_contagem.cont * produtos_kits.quantidade
        ELSE produtos_cesta.unidades
    END,
    unidades_parent = produtos_cesta.unidades,
    produtos_cesta.quantidade,
    produtos.controla_estoque, 
    produtos.status
FROM 
    produtos_cesta 
INNER JOIN produtos 
    ON (produtos_cesta.sku = produtos.sku) 
INNER JOIN produtos_pacotes 
    ON (produtos_cesta.sku = produtos_pacotes.sku) 
INNER JOIN (
    SELECT 
        produtos_cesta.cod_produtos_cesta,
        cont = SUM(
            CASE
                WHEN produtos_kits.quantidade IS NOT NULL THEN produtos_kits.quantidade
                ELSE 1
            END
        )
    FROM 
        produtos_cesta 
    LEFT JOIN produtos_kits 
        ON (produtos_cesta.sku = produtos_kits.sku) 
    LEFT JOIN produtos 
        ON (produtos_cesta.sku = produtos.sku) 
    WHERE 
        shopper_id = '" + mscsShopperId + @"' 
    GROUP BY 
        produtos_cesta.cod_produtos_cesta, 
        produtos_cesta.sku, 
        produtos_cesta.unidades 
) 
AS tab_contagem
    ON (produtos_cesta.cod_produtos_cesta = tab_contagem.cod_produtos_cesta)
LEFT JOIN produtos_kits 
    ON (produtos.sku = produtos_kits.sku) 
LEFT JOIN produtos as produtos2
    ON (produtos_kits.sku_r = produtos2.sku) 
WHERE 
    shopper_id = '" + mscsShopperId + @"' 
GROUP BY 
    produtos_cesta.cod_produtos_cesta, 
    tab_contagem.cont,
    produtos_cesta.sku, 
    produtos_kits.sku_r, 
    produtos.cod_produtos_kits_tipo, 
    produtos2.estoque,
    produtos.controla_estoque, 
    produtos.estoque, 
    produtos.status, 
    produtos.nome_pequeno, 
    produtos_cesta.unidades, 
    produtos_cesta.quantidade,
    produtos_kits.quantidade
ORDER BY 
    produtos_cesta.sku, 
    produtos_cesta.unidades DESC
 5
Author: José Américo Antoine Jr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-21 01:01:51

Jak większość powyżej ustawiła nazwy kolumn zwrotnych, uważam, że ustawianie nazw tabel i warunków bardzo pomaga w czytelności.

SELECT 
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN
    (
        SELECT TOP(1) 
            column4
        FROM 
            table2 INNER JOIN 
            table3 ON table2.column1 = table3.column1
    )

I gdy warunki przyłączenia się są długie.

SELECT
    Column1,
    Column2
FROM 
    Table1 JOIN 
    Table2 ON 
        Table1.Column3 = Table2.Column4 JOIN 
    Table3 ON 
        Table2.Column1 = Table3.Column1 and
        Table2.ColumnX = @x and
        Table3.ColumnY = @y
WHERE
    Condition1=xxx and
    Condition2=yyy and
    (
        Condition3=aaa or
        Condition4=bbb
    )
 5
Author: Jens Frandsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-28 15:04:37

Oczywiście sprowadza się to do osobistych preferencji. A jeśli w zespole, to jest coś, co powinno być uzgodnione między członkami ze względu na spójność. Ale to by było moje preferencje:

SELECT column1, column2
FROM   table1
WHERE  column3 IN(SELECT     TOP(1) column4
                  FROM       table2
                  INNER JOIN table3 ON
                             table2.column1 = table3.column1
                 )
 4
Author: Bullines,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:32:22

Oto mój poke na to:

select column1, column2
    from table1
    where (column3 in (
        select top(1) column4
            from table2
            inner join table3
                on (table2.column1 = table3.column1)
    ))
;
  • Wszystko małe litery, ponieważ łatwiej jest odczytać małe znaki (i mamy podświetlanie kodu, aby podkreślić słowa kluczowe) również łatwiej jest wpisać
  • każde ograniczenie lub opcja na słowie kluczowym (jak from na select lub on na join) jest wcięta, aby pokazać ich zależność od słowa kluczowego outward
  • wspornik zamykający znajduje się na tym samym poziomie wcięcia, co otwór, gdzie
  • Użyj nawiasów dla klauzul where - I on-do zwiększ czytelność
  • średnik zamyka polecenie select w tym samym wcięciu, dzięki czemu można lepiej rozróżnić wiele instrukcji (jeśli potrzebujesz średnika w swoim języku, tak jak SAS PROC SQL)
  • jest nadal dość kompaktowy i nie rozciąga się na całej stronie
 4
Author: John Doe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 08:59:55

Sformatowałbym TAK:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) 
                    column4 
                FROM 
                    table2 
                    INNER JOIN table3 ON table2.column1 = table3.column1)

Lub tak:

SELECT
    column1, 
    column2
FROM 
    table1
WHERE 
    column3 IN (SELECT TOP(1) column4 
                FROM table2 
                INNER JOIN table3 ON table2.column1 = table3.column1)
 3
Author: Mitch Wheat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-08 03:57:19

To moje normalne preferencje:

....SELECT column1
........,column2
....FROM table1
....WHERE column3 IN (
........SELECT TOP(1) column4
........FROM table2
........INNER JOIN table3
............ON table2.column1 = table3.column1
....)

Chociaż stackoverflow psuje formatowanie z dodatkową spacją wiodącą, więc wstawiłem kilka okresów, abyś mógł zobaczyć rzeczywiste formatowanie...

 2
Author: Cade Roux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:41:26

Właśnie wrzuciłem to do mojego SQL prettifier i wyszło tak....

SELECT column1, column2
FROM table1
WHERE column3 IN
(
SELECT TOP(1) column4
    FROM table2
            INNER JOIN table3
            ON table2.column1 = table3.column1
)

Http://extras.sqlservercentral.com/prettifier/prettifier.aspx

.....Ale nie wypracowałem sposobu na wprowadzenie kolorów do StackOverflow.

 2
Author: Patrick Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 18:00:36

Tak, to dość subiektywne...Ale oto moje 2 grosze:

SELECT
   Column1,
   Column2
FROM Table1
WHERE 
   Column3 IN (
      SELECT Column4
      FROM Table2
      JOIN Table3 ON
         Table2.Column1 = Table3.Column1
   )

Ale, naprawdę, pewnie bym to przepisał bez IN:

SELECT
   Column1,
   Column2
FROM Table1
JOIN Table2 ON
   Table1.Column3 = Table2.Column4
JOIN Table3 ON
   Table2.Column1 = Table3.Column1

Zasadniczo moje zasady to:

  • Wielkimi Literami Słowa Kluczowe
  • kolumny idą po poszczególnych liniach, ale wybierz modyfikatory (wybierz TOP 100, Wybierz DISTINCT, itp.) lub pojedyncze kolumny (SELECT 1, SELECT Id, SELECT *, itd.) przejdź do tej samej linii
  • warunki przyłączenia wcięte pod klauzulą przyłączenia
  • użyj JOIN dla wewnętrznego JOIN (ponieważ jest wspólne), i w pełni określić inne (LEFT OUTER JOIN, FULL OUTER JOIN, itp.)
  • Otwórz paren na tej samej linii, Zamknij paren na oddzielnej linii. Jeśli masz alias, alias idzie z close paren.
 2
Author: Mark Brackett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-07 20:16:51

Ten link jest najlepszy jaki znalazłem. http://www.sqlinform.com/free_online_sw.html

 2
Author: Ravi Shankar Kota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-05 12:47:45

Cóż, oczywiście to zależy od zapytania.

Dla prostych zapytań, wysoce formalny schemat wcięć jest po prostu więcej kłopotu niż jest wart i może sprawić, że kod będzie mniej czytelny, a nie więcej. Ale wraz ze wzrostem złożoności musisz zacząć bardziej uważać na to, jak ustrukturyzujesz oświadczenie, aby upewnić się, że będzie ono ponownie czytelne później.

 1
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:45:43

Nie wiem czy jest jakiś standard ale lubię to robić w ten sposób;

SELECT column1, column2
  FROM table1
WHERE column3 IN
(
    SELECT TOP(1) column4
      FROM table2
    INNER JOIN table3
      ON table2.column1 = table3.column1
)

Ponieważ potrafię lepiej czytać i analizować SQL.

 1
Author: Nelson Miranda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-19 17:40:42
SELECT
    Column1,
    Column2
FROM
    Table1
WHERE
    Column3 IN
    (
        SELECT TOP (1)
            Column4
        FROM 
            Table2
        INNER JOIN 
            Table3
        ON
            Table2.Column1 = Table3.Column1
    )
 1
Author: S. Goldberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-03 05:56:03

To co zwykle robię to,

print("SELECT column1, column2
       FROM table1
       WHERE column3 IN (SELECT TOP(1) column4
                         FROM table2 INNER JOIN 
                              table3 ON table2.column1 = table3.column1)");
 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:31:41

To kwestia gustu.

To moje preferencje.
SELECT 
  column1
 ,column2
FROM
  table1
WHERE column3 IN (
                 SELECT TOP(1) column4
                 FROM 
                   table2
                   INNER JOIN table3
                 ON table2.column1 = table3.column1
                 )
 0
Author: JosephStyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-07 14:44:21

Tak byśmy to zrobili tutaj:

select
        COLUMN1,
        COLUMN2,
        case    when    COLUMN5 = 'X'
                        and
                        COLUMN6 = 'Y'
                then    'one'
                when    COLUMN5 in (
                                'AAA',
                                'BBB'
                        )
                then    'two'
                else    'three'
        end as COLUMN7
from
        TABLE1
where
        COLUMN2 in (
                select top(1)
                        COLUMN4
                from
                        TABLE2
                        inner join
                        TABLE3
                                on
                                        TABLE2.COLUMN1 = TABLE3.COLUMN1
                                        and
                                        TABLE2.COLUMN2
                                                between
                                                        TABLE3.COLUMN2
                                                        and
                                                        TABLE3.COLUMN3
        )

Naszym pomysłem jest: zachowaj słowa kluczowe sql w małych literach i umieść wszystkie zmieniające się (a więc "bardziej interesujące") rzeczy, takie jak nazwy tabel lub kolumn w wielkich literach. Kod może wyglądać nieco "wysadzony" tutaj, ale zwiększa czytelność, jeśli masz złożone zapytania o dłuższych nazwach (w tym. schemat itp.) znacznie dłużej niż w tym przykładzie. Oraz: wcięcie wszystkich obiektów zgodnie z ich "poziomem".

 -2
Author: cdw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 09:01:54