2009-04-06 3 views
1

J'essaie de faire une sous-sélection en SQL sur un AS400 et d'obtenir une "erreur de conversion de données ou de mappage de données" - Je suis assez sûr que cela a à voir avec la façon dont SQL gère les dates dans la sous-sélection (en particulier, il est en train de changer le format en ajoutant des virgules dans un champ décimal et il devient confus quand il fait le prochain choix) - quelqu'un pourrait confirmer cela pour moi ?? peut-être suggérer comment je dois contourner ce problème ?? Fondamentalement, j'ai quelque chose comme ci-dessous, avec des dates comme décimal et dans ce format: CCYYMMDD (c'est-à-dire si vous faites juste une sélection sur les dates qu'ils sortent comme CC, YYM, MDD). La date vient de table3Sous-sélection

SELECT * 
FROM TABLE1 A 
    CROSS JOIN TABLE2 B 
    LEFT OUTER JOIN (SELECT * 
         FROM TABLE3 C 
         LEFT OUTER JOIN TABLE4 D ON (blah) 
         INNER JOIN TABLE5 E ON (blah) 
         WHERE DATE >= 20080101 
         AND DATE <= 20090101 
        ) AS C ON (blah AND blah) 
+0

pouvez-vous élaborer sur le bla et bla? peut-être que les paramètres de jointure font partie du problème? TEST: le sous-select fonctionne-t-il seul? Si c'est le cas, ce ne sont pas vos dates. – n8wrl

+0

Comment sont définies les dates. Des dates décimales ou réelles? –

Répondre

4

J'ai peu et daté expérience AS/400, mais votre problème est classique diviser et conquérir.

Isolez la sous-requête - fonctionne-t-elle correctement? Puis commencez avec la table 1 et assurez-vous que la requête croisée fonctionne Puis ajoutez dans la sous-requête.

Je ne sais pas si AS/400 le prend en charge, mais les expressions de table communes de SQL Server sont très utiles - essentiellement des vues de portée locale. Je ne le mentionne que parce que vous pourriez créer une vue qui était votre sous-requête pour une meilleure compréhension.

Dans l'ensemble, je soupçonne que votre problème est dans le "bla et bla :)

0

Pour répondre correctement à cette question, il serait utile de savoir ce que la saveur de « SQL » AS400 travaille avec. L'AS400 en soi n'est qu'un serveur. L'AS400 peut fonctionner avec de nombreuses bases de données telles que DB2, MS SQL Server, Oracle, etc ...

Pour prendre un coup rapide à ce sujet sans savoir quelle saveur SQL je dirais que vous devez mettre autour de votre date valeurs afin qu'ils ne soient pas traités comme des valeurs numériques.

OU DATE> = '20080101' ET DATE < = '20090101'

2

Si vous travaillez avec l'AS400 natif db sa saveur est: DB2 pour iSeries (à ne pas confondre avec DB2 pour Linux et d'autres Si tel est le cas, et que les champs DATE du tableau 3 sont des nombres décimaux numériques au format CCYYMMDD, comme vous le dites, votre comparaison est correcte. Les virgules sont un format appliqué aux décimales pour l'affichage et ne sont pas stockées avec les valeurs.

Je suis d'accord avec n8wrl, essayez un simple "select from Table3 Où DATE> = 20080101" et voir si cela fonctionne, et travailler votre chemin à partir de là.

bla, bla sont très sensibles :)