[SGBD] Voilà pourquoi je n'aime pas la syntaxe SQL 92

Voilà pourquoi je n'aime pas la syntaxe SQL 92 [SGBD] - SQL/NoSQL - Programmation

Marsh Posté le 23-02-2006 à 18:02:10    

Ca se passe de commentaires :o
 

Code :
  1. SELECT a.OrderNumber AS "Commande",
  2. bl.numeroBL AS BL,
  3. bl.dateLivraison AS "Date BL",
  4. a.AssetTag AS "N° d'étiquette",
  5. aa1.IntValue AS "Capacité SD card",
  6. a.SerialNumber AS "N° SERIE PDA",
  7. aa2.CharValue AS "IMEI PDA",
  8. aa3.CharValue AS "N° CARTE SIM",
  9. aa3.SerialNumber AS "N° SERIE SIM",
  10. a.ReceiptDate AS "Date Réception",
  11. aa4.CharValue AS Login,
  12. NULL /*aa5.CharValue*/ AS Pwd,
  13. aa6.CharValue AS "Adresse IP",
  14. aa7.CharValue AS "Contrat",
  15. aa8.CharValue AS "Numéro d'appel",
  16. NULL /*aa9.CharValue*/ AS "Code PIN",
  17. NULL /*aa10.CharValue*/ AS "Code PUK",
  18. aa11.CharValue AS "Etat de la ligne",
  19. a.InstallDate AS "Date du 1er déploiement",
  20. aa12.CharValue AS Fournisseur,
  21. a.Active AS Actif,
  22. (CASE a.DiscoveryLink WHEN 'ParcLoue' THEN 'ParcLoue' ELSE 'ParcFP' END) AS ParcLoue,
  23. e.Code AS Matricule,
  24. d.Code AS "Appartenance asset",
  25. a1.Code AS "Asc4 asset",
  26. l.Code AS "Lieu asset",
  27. r.region AS "Région asset",
  28. e.LastName AS "Nom",
  29. e.FirstName AS "Prénom",
  30. d1.Code AS "Appartenance employé",
  31. a2.Code AS "Asc4 employé",
  32. l1.Code AS "Lieu employé",
  33. r1.region AS "Région employé"
  34. FROM (
  35.  (
  36.   (
  37.    (
  38.     (
  39.      (
  40.       (
  41.        (
  42.         (
  43.          (
  44.           (
  45.            (
  46.             (
  47.              (
  48.               (
  49.                (
  50.                 (
  51.                  (
  52.                   (
  53.                    (
  54.                     (
  55.                      (
  56.                       (
  57.                        (
  58.                         (
  59.                          Asset AS a
  60.                          INNER JOIN
  61.                          ZAssetBonLivraison AS abl
  62.                          ON a.AssetID = abl.assetId
  63.                         )
  64.                         INNER JOIN
  65.                         ZBonLivraison AS bl
  66.                         ON abl.BLid = bl.BLid
  67.                        )
  68.                        LEFT JOIN
  69.                        Department AS d
  70.                        ON a.DepartmentID = d.DepartmentID
  71.                       )
  72.                       LEFT JOIN
  73.                       AssetAccountCharge AS aac
  74.                       ON a.AssetID = aac.AssetID
  75.                      )
  76.                      LEFT JOIN
  77.                      Account AS a1
  78.                      ON aac.AccountID = a1.AccountID
  79.                     )
  80.                     LEFT JOIN
  81.                     Location AS l
  82.                     ON a.LocationID = l.LocationID
  83.                    )
  84.                    LEFT JOIN
  85.                    zRegionDetail AS rd
  86.                    ON a1.AccountID = rd.accId AND l.LocationID = rd.locId
  87.                   )
  88.                   LEFT JOIN
  89.                   zRegion AS r
  90.                   ON rd.regionId = r.regionId
  91.                  )
  92.                  LEFT JOIN
  93.                  Employee AS e
  94.                  ON a.EmployeeID = e.EmployeeID
  95.                 )
  96.                 LEFT JOIN
  97.                 Department AS d1
  98.                 ON e.DepartmentID = d1.DepartmentID
  99.                )
  100.                LEFT JOIN
  101.                Account AS a2
  102.                ON e.AccountID = a2.AccountID
  103.               )
  104.               LEFT JOIN
  105.               Location AS l1
  106.               ON e.LocationID = l1.LocationID
  107.              )
  108.              LEFT JOIN
  109.              zRegionDetail AS rd1
  110.              ON a2.AccountID = rd1.accId AND l1.LocationID = rd1.locId
  111.             )
  112.             LEFT JOIN
  113.             zRegion AS r1
  114.             ON rd1.regionId = r1.regionId
  115.            )
  116.            LEFT JOIN
  117.            (
  118.             SELECT a.BaseUnitAssetID,
  119.              aa.IntValue
  120.             FROM Asset AS a
  121.              INNER JOIN
  122.              AssetAttributes AS aa
  123.              ON a.AssetID = aa.AssetID
  124.             WHERE a.CatalogType = 'Memory'
  125.              AND
  126.              aa.AttributeName = 'Memory Size'
  127.            ) AS aa1
  128.            ON a.AssetID = aa1.BaseUnitAssetID
  129.           )
  130.           LEFT JOIN
  131.           (
  132.            SELECT a.BaseUnitAssetID,
  133.             aa.CharValue
  134.            FROM Asset AS a
  135.             INNER JOIN
  136.             AssetAttributes AS aa
  137.             ON a.AssetID = aa.AssetID
  138.            WHERE a.CatalogType = 'Computer - Handheld'
  139.             AND
  140.             aa.AttributeName = 'IMEI'
  141.           ) AS aa2
  142.           ON a.AssetID = aa2.BaseUnitAssetID
  143.          )
  144.          LEFT JOIN
  145.          (
  146.           SELECT a.BaseUnitAssetID,
  147.            a.SerialNumber,
  148.            aa.CharValue
  149.           FROM Asset AS a
  150.            INNER JOIN
  151.            AssetAttributes AS aa
  152.            ON a.AssetID = aa.AssetID
  153.           WHERE a.CatalogType = 'SIM Card'
  154.            AND
  155.            aa.AttributeName = 'SIM Number'
  156.          ) AS aa3
  157.          ON a.AssetID = aa3.BaseUnitAssetID
  158.         )
  159.         LEFT JOIN
  160.         (
  161.          SELECT a.BaseUnitAssetID,
  162.           aa.CharValue
  163.          FROM Asset AS a
  164.           INNER JOIN
  165.           AssetAttributes AS aa
  166.           ON a.AssetID = aa.AssetID
  167.          WHERE a.CatalogType = 'Computer - Handheld'
  168.           AND
  169.           aa.AttributeName = 'Login'
  170.         ) AS aa4
  171.         ON a.AssetID = aa4.BaseUnitAssetID
  172.        )
  173.        /*LEFT JOIN
  174.        (
  175.         SELECT a.BaseUnitAssetID,
  176.          aa.CharValue
  177.         FROM Asset AS a
  178.          INNER JOIN
  179.          AssetAttributes AS aa
  180.          ON a.AssetID = aa.AssetID
  181.         WHERE a.CatalogType = 'Computer - Handheld'
  182.          AND
  183.          aa.AttributeName = 'Password'
  184.        ) AS aa5
  185.        ON a.AssetID = aa5.BaseUnitAssetID*/
  186.       )
  187.       LEFT JOIN
  188.       (
  189.        SELECT a.BaseUnitAssetID,
  190.         aa.CharValue
  191.        FROM Asset AS a
  192.         INNER JOIN
  193.         AssetAttributes AS aa
  194.         ON a.AssetID = aa.AssetID
  195.        WHERE a.CatalogType = 'Precise Location'
  196.         AND
  197.         aa.AttributeName = 'Network Address'
  198.       ) AS aa6
  199.       ON a.AssetID = aa6.BaseUnitAssetID
  200.      )
  201.      LEFT JOIN
  202.      (
  203.       SELECT a.BaseUnitAssetID,
  204.        aa.CharValue
  205.       FROM Asset AS a
  206.        INNER JOIN
  207.        AssetAttributes AS aa
  208.        ON a.AssetID = aa.AssetID
  209.       WHERE a.CatalogType = 'SIM Card'
  210.        AND
  211.        aa.AttributeName = 'Telco Contract'
  212.      ) AS aa7
  213.      ON a.AssetID = aa7.BaseUnitAssetID
  214.     )
  215.     LEFT JOIN
  216.     (
  217.      SELECT a.BaseUnitAssetID,
  218.       aa.CharValue
  219.      FROM Asset AS a
  220.       INNER JOIN
  221.       AssetAttributes AS aa
  222.       ON a.AssetID = aa.AssetID
  223.      WHERE a.CatalogType = 'SIM Card'
  224.       AND
  225.       aa.AttributeName = 'Line Number'
  226.     ) AS aa8
  227.     ON a.AssetID = aa8.BaseUnitAssetID
  228.    )
  229.    /*LEFT JOIN
  230.    (
  231.     SELECT a.BaseUnitAssetID,
  232.      aa.CharValue
  233.     FROM Asset AS a
  234.      INNER JOIN
  235.      AssetAttributes AS aa
  236.      ON a.AssetID = aa.AssetID
  237.     WHERE a.CatalogType = 'SIM Card'
  238.      AND
  239.      aa.AttributeName = 'PIN Code'
  240.    ) AS aa9
  241.    ON a.AssetID = aa9.BaseUnitAssetID*/
  242.   )
  243.   /*LEFT JOIN
  244.   (
  245.    SELECT a.BaseUnitAssetID,
  246.     aa.CharValue
  247.    FROM Asset AS a
  248.     INNER JOIN
  249.     AssetAttributes AS aa
  250.     ON a.AssetID = aa.AssetID
  251.    WHERE a.CatalogType = 'SIM Card'
  252.     AND
  253.     aa.AttributeName = 'PUK Code'
  254.   ) AS aa10
  255.   ON a.AssetID = aa10.BaseUnitAssetID*/
  256.  )
  257.  LEFT JOIN
  258.  (
  259.   SELECT a.BaseUnitAssetID,
  260.    aa.CharValue
  261.   FROM Asset AS a
  262.    INNER JOIN
  263.    AssetAttributes AS aa
  264.    ON a.AssetID = aa.AssetID
  265.   WHERE a.CatalogType = 'SIM Card'
  266.    AND
  267.    aa.AttributeName = 'Status'
  268.  ) AS aa11
  269.  ON a.AssetID = aa11.BaseUnitAssetID
  270. )
  271. LEFT JOIN
  272. (
  273.  SELECT a.BaseUnitAssetID,
  274.   aa.CharValue
  275.  FROM Asset AS a
  276.   INNER JOIN
  277.   AssetAttributes AS aa
  278.   ON a.AssetID = aa.AssetID
  279.  WHERE a.CatalogType = 'SIM Card'
  280.   AND
  281.   aa.AttributeName = 'Telco Provider'
  282. ) AS aa12
  283. ON a.AssetID = aa12.BaseUnitAssetID
  284. WHERE a.ItemCategory = 'Computer - handheld'
  285. AND
  286. (
  287.  a.Description LIKE '%qtek%'
  288.  OR
  289.  a.Description LIKE '%ipaq%'
  290. )
  291. AND
  292. a.LineType = 'B'
  293. ORDER BY
  294. a.AssetID


 
PS: c pas moi qui l'ai fait :p


Message édité par Arjuna le 23-02-2006 à 18:04:00
Reply

Marsh Posté le 23-02-2006 à 18:02:10   

Reply

Marsh Posté le 23-02-2006 à 18:16:12    

Joli ! et je suis d'accord avec toi à propos des JOIN.

Reply

Marsh Posté le 23-02-2006 à 18:19:59    

J'pense que tu peux le proposer au Daily WTF, parce que sans connaître grand chose au SQL quand on atteint 25 niveaux d'indentation il y a quand même un problème quelque part [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-02-2006 à 18:23:45    

C'est très esthétique. J'adore le moment ou tu découvres les parenthèses ouvrantes, que tu continues à scoller et que les INNER JOINs se révèlent à toi. Ca me donne des frissons tellement stro beau. [:dawa]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 15-10-2009 à 15:31:50    

Il faut être un grand malade pour écrire une requête pareille...
 
Ou alors il ne faut rien connaître à la puissance de SQL

Reply

Marsh Posté le 15-10-2009 à 15:36:39    

Ca donne mal à la tête....
 
J'ai déjà vu pire et sans indentation

Reply

Marsh Posté le 15-10-2009 à 15:43:36    

je sais pas qui est le connard qui a écrit ça, mais il mériterait de devoir maintenir son code.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-10-2009 à 15:48:53    

Magnifique remontage de topic [:romf]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 15-10-2009 à 15:55:51    

ah merde! [:god]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 15-10-2009 à 16:11:43    

une dédicace à harko; assurément


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 15-10-2009 à 16:11:43   

Reply

Marsh Posté le 15-10-2009 à 16:34:46    

antac a écrit :

Ca donne mal à la tête....
 
J'ai déjà vu pire et sans indentation


je plussoie fortement!  
 
du genre une requête qui rame et que tu t'aperçois qu'elle parcours la plus grosse table de la base, non pas 1 fois mais 4 récurisvement, avec un truc du genre

Code :
  1. SELECT blabla
  2. FROM biggest_table
  3. WHERE
  4.    toto NOT IN ( SELECT tata FROM biggest_table WHERE truc)
  5. AND
  6.    tutu NOT IN ( SELECT titi FROM biggest_table WHERE machin AND chose NOT IN ( SELECT tyty FROM biggest_table WHERE bidule))


 
sachant que la plus grosse table faisait environ 10 millions de lignes, je vous laisse imaginer comment oracle se casse le cul... avec un plan illisible au possible.
 
et après

Citation :

Le client:
ca rame la requete!
 
Nous:
sans déconner? vous zavez qu'a vous payer une vraie tma

(je précise que nous on était infogérant et pas tma ^^)

Reply

Marsh Posté le 17-10-2009 à 00:14:14    

Il y a environ deux ans, on a découvert sur un projet pour lequel je bossais (je tairai le nom du client pour lequel un développeur a commis ça :o) le même genre de requête, mais étalée sur 450 lignes :D.

 

Un unique select avec des requetes imbriquées sur plusieurs niveaux, des union, des colonnes fictives pour faire coller les union entre eux, des full join... y avait de tout. Et evidemment sur les plus grosses tables de la base comme il se doit dans ce genre de cas. On n'a même pas compris à quoi ça a pu servir un jour et pourtant quand on a découvert cette perle on s'est mis à 8 dessus pour se marrer et essayer de deviner d'où ça pouvait être appelé dans la tripotée d'appli qu'on avait de planquées dans tous les coins...

 

Par contre de mémoire on n'avait pas d'alias aussi explicites et univoque que les tiens, il y a un challenge à relever là.


Message édité par TotalRecall le 17-10-2009 à 00:15:56

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 19-10-2009 à 12:52:59    

black_lord a écrit :

une dédicace à harko; assurément


Le maître ès SQL de ce forum, même Joce prend des cours chez lui :jap:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed