2010-12-14 3 views
0

Используя это утверждение:выражение не-булева типа

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) 

Эта ошибка происходит:

Msg 4145, Level 15, состояние 1, строка 3 выражение не-логического типа указанного в контексте, где ожидается условие, около ','. Msg 156, Level 15, State 1, Line 8 Неверный синтаксис рядом с ключевым словом 'group'.

Что не так с этим оператором SQL? Мне нужно найти все вхождения этих трех полей в таблице having min(rid).

Обновление Используя этот запрос, внешний выбор не работает. Что я делаю не так?

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, о котором вы говорите? А где строка 8? – gbn

+0

@gbn да действительно –

ответ

2

Я думаю, что это эквивалентно тому, чего вы пытаетесь достичь.

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 Большое вам спасибо за вашу помощь. я добавил еще один небольшой уровень сложности, вы можете помочь? –

+0

Если несколько строк в строке batchinfo для заданной строки qvalues, вы получите несколько строк bollixing u phaving count (*) – gbn

+0

@gbn: Хороший улов. –

1

Окончательные having min(rid) потребности иметь сравнение

Сказать, что нет связано GROUP BY, которые вы можете увидеть, если вы изменить ваш фрагмент кода

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: переформулируется:

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 

И ваша первоначальная ошибка, вероятно, связана с отсутствием lias производной таблицы, а также тот факт, что SQL Server не поддерживает многоколоночное IN. Я использую EXISTS не JOIN, потому что вы можете получить больше строк из qvalues ​​JOIN batchinfo, чем вы ожидаете (на основе ответа Джо)

+0

@gbn спасибо, я обновил –

+0

@gbn обновлен снова –

+0

@gbn Msg 102, Level 15, State 1, Line 16 Неправильный синтаксис возле 'foo'. –

Смежные вопросы