2010-12-14 45 views
0

En utilisant cette déclaration:expression de type non booléen

select * from qvalues where rowid ,name,compound in (
    select rowid,name,compound from qvalues where rowid in (select rowid from batchinfo where instrument='tf1') 
    group by rowid,name,compound 
    having COUNT(*)>1 
    ) 
    group by rowid,name,compound 
having rid=min(rid) 

Cette erreur se produit:

Msg 4145, niveau 15, état 1, ligne 3 Une expression de type non booléen spécifié dans un contexte où une condition est attendue, proche de ','. Msg 156, niveau 15, état 1, ligne 8 Syntaxe incorrecte à proximité du mot clé 'groupe'.

Quel est le problème avec cette instruction SQL? J'ai besoin de trouver toutes les occurrences de ces trois champs dans la table having min(rid).

Mise à jour En utilisant cette requête, la sélection externe ne fonctionne pas. Qu'est-ce que je fais mal?

select * from qvalues where rid not in (
select q.rowid, q.name, q.compound, min(q.rid) 
    from qvalues q 
     inner join batchinfo b 
      on q.rowid = b.rowid 
       and b.instrument = 'tf1' 
    group by q.rowid, q.name, q.compound 
    having count(*) > 1) 
+0

SQL Server dites-vous? Et où est la ligne 8? – gbn

+0

@gbn oui en effet –

Répondre

2

Je pense que cela équivaut à ce que vous essayez d'atteindre.

select min(q.rid) 
    from qvalues q 
     inner join batchinfo b 
      on q.rowid = b.rowid 
       and b.instrument = 'tf1' 
    group by q.rowid, q.name, q.compound 
    having count(*) > 1 
+0

@joe merci beaucoup pour votre aide. J'ai ajouté un autre léger niveau de complexité pouvez-vous aider s'il vous plaît? –

+0

si plusieurs lignes batchinfo pour une ligne qvalues ​​donnée, alors vous obtiendrez plusieurs lignes bollixing count count (*) – gbn

+0

@gbn: Bonne capture. –

1

Les having min(rid) finales doit avoir la comparaison

Dire que, il n'y a pas de groupe associé par lequel vous pouvez voir si vous réorganisez votre extrait de code

select * from qvalues 
where rowid ,name,compound in (
       select rowid,name,compound from qvalues 
       where rowid in (select rowid from batchinfo where instrument='tf1') 
       group by rowid,name,compound 
       having COUNT(*)>1 
       ) 
--missing group by 
having min(rid) -- > foo 

Edit: reformulé:

select 
    * 
from 
    (
    select 
     rowid,name,compound, min(q.rid) as minrid 
    from 
     qvalues q 
    where 
     EXISTS (SELECT * FROM batchinfo b where b.instrument='tf1' AND b.rowid = q.rowid) 
    group by 
     rowid,name,compound 
    having 
     COUNT(*)>1 
    ) foo 
    JOIN 
    qvalues q2 On foo.rowid = q.rowid AND foo.name = q.name AND foo.compound = q.compound 
        AND foo.minrid = q2.rid 

Et votre erreur d'origine vient probablement d'al ack d'alias de la table dérivée, couplé avec le fait que SQL Server ne supporte pas IN multi-colonne. J'utilise EXISTS non JOIN parce que vous pouvez obtenir plus de lignes de qvalues ​​JOIN lotinfo que ce que vous attendez (basé sur la réponse de Joe)

+0

@gbn merci j'ai mis à jour –

+0

@gbn mis à jour à nouveau –

+0

@gbn Msg 102, niveau 15, état 1, ligne 16 Syntaxe incorrecte près de 'foo'. –