IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Table fantôme


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut Table fantôme
    Je dois mettre en place une application qui se greffe sur une autre en utilisant sa base de donnée.

    Je me trouve confronté au problème suivant : une requête qui fait appelle à une table que je ne trouve nul part :

    SELECT
    dbo.workorder.status,...
    FROM
    dbo.labor dbo_laborreal,
    dbo.workorder,
    locancestor
    WHERE
    ( dbo.workorder.location=locancestor.location )
    AND ( dbo.workorder.supervisor*=dbo_laborreal.laborcode )
    AND ...

    La table dbo.labor existe, mais je ne sais pas a quoi correspond le dbo_laborreal, donc si quelqu'un sait à quoi cela corespond...

  2. #2
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut

    tu as regardé en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM sysobjects ORDER BY name
    sur ta abse si elle existait encore cette table :

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    j'ai fait le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM sysobjects ORDER BY name
    mais cette table n'apparait pas.

    ce pourrait il que ce soit un alias? (même si je n'en vois pas l'utilité)

  4. #4
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    j'en ai franchement aucune idée mais c'est bizarre car dbo c'est une table système ça ou un truc du style :

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    dbo c'est le database owner, c'est pas obligatoire de le mettre dans les requetes
    le code suivant fonctionne et renvoi la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    workorder.status,... 
    FROM 
    labor dbo_laborreal, 
    workorder, 
    locancestor 
    WHERE 
    ( workorder.location=locancestor.location ) 
    AND ( workorder.supervisor*=dbo_laborreal.laborcode ) 
    AND ...
    de plus j'ai tester et le code suivant me renvoi egalement la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
    dbo.workorder.status,... 
    FROM 
    dbo.labor, 
    dbo.workorder, 
    locancestor 
    WHERE 
    ( dbo.workorder.location=locancestor.location ) 
    AND ( dbo.workorder.supervisor*=dbo.labor.laborcode ) 
    AND ...
    c'est bizarre... on dirait que la table labor, c'est la même chose que labor dbo_laborreal.
    Est ce possible que ce soit utiliser pour autre chose afin de faire une jointure sur elle même? (dans quel but?)

  6. #6
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    ça serait stupide car pour faire une jointure sur elle même tu fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table t1 INNER JOIN table t2 ON t1.id=t2.id
    tu utilise al même table.

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    oui, mais dans le cas ou tu as besoin de plusieurs instances d'une table que du dois relier avec un left join ou un right join (*= ou =*), ca peut être possible non?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    workorder.supervisor*=dbo_laborreal.laborcode
    sinon je vois pas à quoi ca peut bien servir.

  8. #8
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    non c'est pareil que tu fasses un {RIGTH | LEFT | FULL} OUTER JOIN, vu que tes tables contiennent la même chose. Enfin c'est ce qui me semble le plus logique.
    Je vois vraiment pas ce qu'est cette table franchement.

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    j'ai un peu regarder les autres requêtes, y'en a une qui est encore bien pire.
    Elle est trop grande donc je met que ce qu'il y a dans le from
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     dbo.labor,
      dbo.labor  dbo_laborreal,
      dbo.workorder  workorder_parent,
      dbo.workorder  workorder_parent_c,
      dbo.workorder,
      dbo.longdescription  DESCRIPTION_longdesc,
      dbo.longdescription  DESCRIPT_longdesc_exist,
      dbo.longdescription  DEPANNAGE_longdesc,
      dbo.longdescription  MODIMPACT_longdesc,
      dbo.longdescription  ANASOLUT_longdesc,
      dbo.longdescription  JUSTIFIGAIN_longdesc
    sachant que le select contient un grand nombre de champs(60) et que dans le where, j'ai une multitude de jointure du type *=.
    En plus j'ai l'impression que personne n'est au courant que ce truc existe, et j'ai jamais vu ca.

  10. #10
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    j'adore, les alias sont encore plus long que la table elle-même lol.
    Pour revenir au problème initial, tu as essayé de faire : pour voir s'il y a quelque chose dedans (et si elle existe ou pas) :

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    j'ai fait le il marche correctement.

    j'ai aussi fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM labor dbo_laborreal
    ca fait exactement la même chose.

    pire : je peux mettre n'importe quoi apres le labor, ca renvoi toujours la même chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM labor tototititatatutu
    de plus ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select toto.laborcode from labor toto
    ca fonctionne

    ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select labor.laborcode from labor toto
    ca marche pas (il me dit qu'il connait pas labor, alors que cette table existe)

    et ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select labor.laborcode from labor
    ca marche

    y'a des fois, je me demande comment les mecs ils programment!!!

  12. #12
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    lol, mais c'est normal c'est des alias : c'est comme je t'ai montré quand j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table t1 INNER JOIN table t2 ON t1.id=t2.id
    ça te sert par exemple si tu as un nom trop long ou alors que tu veux faire une auto-jointure (comme je te le montre).
    C'était ça le problème : : : Parce que ça c'est pas un problème, c'est le langage qui fonctionne comme ça
    Y'a eu un putin de quiproquo, excellent
    Je te prie de m'excuser de ne pas avoir percuté le truc dès le début : c'était tellement gros que j'ai pas imprimé scuz'

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    alors ca veut dire que celui qui a fait les requête, il avait besoin de faire des auto-jointures, donc c'est la même table à chaque fois.
    Mais pour comprendre les requetes et ce que ca va renvoyer, ca devient compliqué.
    Y'aurait pas un moyen de rendre ces requête un peu plus simple, parce que quand y'a qu'une auto-jointure ca reste comprehensible, mais quand il commence a en avoir un floppé, comme ici, je comprends plus rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    SELECT
      workorder_parent.wonum,
      workorder_parent.Description,
      workorder_parent_c.wonum,
      workorder_parent_c.Description,
      dbo.workorder.wol1,
      dbo.workorder.statusdate,
      convert(datetime,convert(char(10),( dbo.workorder.statusdate ),112)),
      datepart(cwk,( convert(datetime,convert(char(10),( dbo.workorder.statusdate ),112)) )),
      datepart(hh,dbo.workorder.statusdate) * 10000 +  datepart(mi,dbo.workorder.statusdate) * 100 +  datepart(ss,dbo.workorder.statusdate),
      dbo.workorder.Description,
      DESCRIPTION_longdesc.ldtext,
      DESCRIPT_longdesc_exist.ldtext,
      dbo.workorder.Wo9,
      DEPANNAGE_longdesc.ldtext,
      dbo.workorder.wopm1,
      dbo.workorder.wonum,
      dbo.workorder.parent,
      dbo.workorder.wo19,
      dbo.workorder.Wo18,
      dbo.workorder.Wo2,
      dbo.workorder.reportdate,
      convert(datetime,convert(char(10),( dbo.workorder.reportdate ),112)),
      datepart(cwk,( convert(datetime,convert(char(10),( dbo.workorder.reportdate ),112)) )),
      convert(datetime,convert(varchar(12),(dateadd(dd,-datepart(day,dbo.workorder.reportdate)+1,dbo.workorder.reportdate)))),
      datepart(hh,dbo.workorder.reportdate) * 10000 +  datepart(mi,dbo.workorder.reportdate) * 100 +  datepart(ss,dbo.workorder.reportdate),
      dbo.workorder.Wo20,
      dbo.workorder.status,
      dbo.workorder.WO16,
      dbo.workorder.location,
      datepart(cwk,dbo.workorder.reportdate),
      dbo.workorder.reportedby,
      dbo.labor.name,
      dbo.workorder.Wol2,
      dbo.workorder.wo1,
      dbo.workorder.Wo10,
      MODIMPACT_longdesc.ldtext,
      dbo.workorder.Wo11,
      dbo.workorder.Wo8,
      ANASOLUT_longdesc.ldtext,
      dbo.workorder.leadcraft,
      dbo.workorder.supervisor,
      dbo_laborreal.name,
      dbo.workorder.WO17,
      dbo.workorder.wo3,
      dbo.workorder.wo12,
      JUSTIFIGAIN_longdesc.ldtext,
      dbo.workorder.schedstart,
      dbo.workorder.schedfinish,
      dbo.workorder.wo6,
      dbo.workorder.wo6,
      dbo.workorder.wopm3,
      dbo.workorder.wopm4,
      dbo.workorder.wo15,
      dbo.workorder.wo15,
      dbo.workorder.targstartdate,
      dbo.workorder.targcompdate,
      dbo.workorder.historyflag,
      dbo.workorder.wopm5,
      dbo.workorder.haschildren,
      dbo.workorder.wopriority
    FROM
      dbo.labor,
      dbo.labor  dbo_laborreal,
      dbo.workorder  workorder_parent,
      dbo.workorder  workorder_parent_c,
      dbo.workorder,
      dbo.longdescription  DESCRIPTION_longdesc,
      dbo.longdescription  DESCRIPT_longdesc_exist,
      dbo.longdescription  DEPANNAGE_longdesc,
      dbo.longdescription  MODIMPACT_longdesc,
      dbo.longdescription  ANASOLUT_longdesc,
      dbo.longdescription  JUSTIFIGAIN_longdesc,
      locancestor
    WHERE
      ( DESCRIPTION_longdesc.ldownercol = 'DESCRIPTION' and DESCRIPTION_longdesc.ldownertable = 'WORKORDER'  )
      AND  ( DESCRIPTION_longdesc.ldkey=*dbo.workorder.ldkey  )
      AND  ( DEPANNAGE_longdesc.ldkey=*dbo.workorder.ldkey  )
      AND  ( DEPANNAGE_longdesc.ldownercol = 'Wo9' and DEPANNAGE_longdesc.ldownertable = 'WORKORDER'  )
      AND  ( MODIMPACT_longdesc.ldownercol = 'Wo10' and MODIMPACT_longdesc.ldownertable = 'WORKORDER'  )
      AND  ( dbo.workorder.ldkey*=MODIMPACT_longdesc.ldkey  )
      AND  ( ANASOLUT_longdesc.ldownercol = 'Wo8' and ANASOLUT_longdesc.ldownertable = 'WORKORDER'  )
      AND  ( ANASOLUT_longdesc.ldkey=*dbo.workorder.ldkey  )
      AND  ( JUSTIFIGAIN_longdesc.ldkey=*dbo.workorder.ldkey  )
      AND  ( JUSTIFIGAIN_longdesc.ldownercol = 'Wo12' and JUSTIFIGAIN_longdesc.ldownertable = 'WORKORDER'  )
      AND  ( dbo.workorder.parent*=workorder_parent.wonum  )
      AND  ( DESCRIPT_longdesc_exist.ldownercol = 'DESCRIPTION' and DESCRIPT_longdesc_exist.ldownertable = 'WORKORDER'  )
      AND  ( DESCRIPT_longdesc_exist.ldkey=dbo.workorder.ldkey  )
      AND  ( dbo.workorder.location=locancestor.location  )
      AND  ( workorder_parent_c.wonum=dbo.workorder.parent  )
      AND  ( dbo.labor.laborcode=dbo.workorder.reportedby  )
      AND  ( dbo.workorder.supervisor*=dbo_laborreal.laborcode  )
      AND  (
      dbo.workorder.wopm1  !=  'ASTREINTE'
      AND  dbo.workorder.historyflag  =  'N'
      AND  (locancestor.ancestor  =  'POLI GMAO'
      OR   dbo.workorder.leadcraft  =  'GMAO-MP'
      OR   dbo.workorder.parent  =  ANY (SELECT
      dbo.workorder.wonum
    FROM
      dbo.workorder
    WHERE
      ( 
      dbo.workorder.supervisor  =  'P002872'
      AND  dbo.workorder.historyflag  =  'N'
      )
    )
      OR   dbo.workorder.supervisor  =  'E001691')
      AND  dbo.workorder.WO17  IS NOT NULL  
      AND  dbo.workorder.status  !=  '10 SOLDE'
      )
    il faut que je comprenne a quoi sert cette requete (et d'autre, mais c'est celle la la pire)
    si tu connais un moyen pour comprendre un requête comme ca, ce serait cool (mais je me fais pas d'illusion)

    Merci

  14. #14
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    franchement, cette requête elle est pas compliquée du tout : il y a une seule sous-requête, après ces des conditons simple du style nom='jean-paul'.
    C'est impressionant parce qu'il y a une longue déclaration dans le SELECT mais c'est tout.
    Déjà toutes les jointures qui sont dans le WHERE tu devrais les faire passer dans le FROM(gain de vitesse lors de l'éxecution, propreté du code, normalisation du code)
    ex : au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FROM dbo.workorder, 
    dbo.longdescription DESCRIPTION_longdesc,
    dbo.longdescription DEPANNAGE_longdesc, 
    WHERE DESCRIPTION_longdesc.ldkey=*dbo.workorder.ldkey  
      AND DEPANNAGE_longdesc.ldkey=*dbo.workorder.ldkey
    tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM workorder LEFT OUTER JOIN longdescription description ON description.ldkey=workorder.ldkey,
                   LEFT OUTER JOIN longdescription depannage ON depannage.ldkey=workorder.ldkey,
    ça pour toute les jointures et tu auras un code bien plus lisible (et plus rapide).
    Tu vas te ré-ga-ler

    PS : c'est vraiment un bordel infâme cette requête, le gars qui l'a fait a sélectionné plusieurs fois les mêmes champs, toutes les jointures sont dans le WHERE, il y des nomsaralongequepluslongtupeuxpasfaire, ... bref c'est le waye.

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 30
    Points : 20
    Points
    20
    Par défaut
    Ok.
    Je crois que j'ai enfin compris à quoi ca sert.

    Merci pour l'aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Données "fantômes" dans une table suite passage access 2003 à 2010
    Par I Need Help dans le forum Modélisation
    Réponses: 11
    Dernier message: 20/09/2012, 12h19
  2. Décalage fantôme dans <table> design
    Par BnA dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 30/09/2009, 09h39
  3. Réparation table/entête endommagée
    Par tbesrour dans le forum Paradox
    Réponses: 15
    Dernier message: 27/11/2007, 10h42
  4. Newbie......compilateur et table de caractères
    Par Cyberf dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 21/08/2002, 14h29
  5. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo