2011-09-06 4 views
0

Je souhaite pouvoir sélectionner des données de TableA où Field1 est supérieur à Field2 dans la TableB.Sélectionnez les données d'une table où un champ est supérieur à celui d'un autre champ d'une autre table.

Dans ma tête image i à être quelque chose comme ça

Select TableA.* 
    from TableA 
    Join TableB 
    On TableA.PK = TableB.FK 

    WHERE TableA.Field1 > TableB.Field2 

J'utilise SQL Server 2005 et le TableA.Field1 et tableB.Field2 ressembler à:

2004102881010 - data type - Vrachar 

Mon PK et FK ressemble à:

0908232  - data type - nvarchar 

Le problème est lorsque cette requête est exécutée TOUTES les données sont affichées et pas seulement e les lignes où Field1 est supérieur.

cheers :)

+1

Alors, pourquoi cela ne fonctionne-t-il pas? Quelle erreur rencontrez-vous? – billinkc

+0

La requête que vous nous avez montrée ne fonctionne-t-elle pas? –

+0

Non son ne fonctionne pas, il retourne toutes les données, pas seulement les lignes que Field1 est supérieur. – PDB

Répondre

0

semble fonctionner correctement pour ce code de démonstration. Peut-être que je ne comprends pas le problème ou les données.

; 
with TABLEA (PK, Field1) AS 
(

    -- Sample row that is filtered out 
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50)) 
    -- This is bigger than what's in B 
    UNION ALL SELECT CAST('0908232' AS nvarchar(10)), CAST('2005102881010' AS varchar(50)) 
) 
, TABLEB(FK, Field2) AS 
(
    -- This matches row 1 above and will be excluded 
    SELECT CAST('0908232' AS nvarchar(10)), CAST('2004102881010' AS varchar(50)) 
) 
SELECT TableA.* 
FROM TableA 
INNER JOIN TableB 
ON TableA.PK = TableB.FK 
WHERE TableA.Field1 > TableB.Field2 

Résultats

PK  Field1 
0908232 2005102881010 
+0

Exécutez à nouveau votre test en comparant CAST ('2004102881010' comme varchar (50)) avec CAST ('9' comme varchar (50)) – Chains

+0

Pourquoi devrais-je faire cette comparaison? OP n'a pas fourni de données pour indiquer que les valeurs courtes pour Field1/Field2 constituaient un problème. Mais je suis d'accord que la comparaison de chaîne est probablement le problème comme indiqué dans mon commentaire ci-dessus sur les choses trier drôle – billinkc

+0

Re: Pourquoi ferais-je cette comparaison ... parce que le code de démo que vous avez écrit serait un '9' * après * '2004102881010' (parce qu'il fait une comparaison de chaîne, pas une comparaison de nombre). Je pense que OP cherche une comparaison de nombre. – Chains

0

Cela semble être un problème avec des zéros manquants: 20041028 * * 81010

Il n'y a rien de mal à votre requête, mais vos données. Considérez 2001-01-01 01:01:01, ce serait considéré comme: 200111111 Il devrait être considéré comme: 20010101010101

0

opérateurs comparrison (>, <) utilisés sur les chaînes (Varchars, nvarchars, etc.) travailler par ordre alphabétique. Par exemple, '9'> '11' est vrai. Vous pourriez essayer de faire une conversion de type de données ...

WHERE cast(A.field1 as int) > cast(B.field2 as int) 
+0

Cela renvoie toujours toutes les données – PDB

+0

@PDB - Veuillez fournir un exemple de fichier de données (en particulier, les données renvoyées qui * ne devraient pas être retournées. – Chains

Questions connexes