выражение небулева типа - PullRequest
0 голосов
/ 14 декабря 2010

Используя этот оператор:

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)

Эта ошибка возникает:

Сообщение 4145, уровень 15, состояние 1, строка 3 Выражение не-логического типа, указанное вконтекст, в котором ожидается состояние, рядом с ','.Сообщение 156, уровень 15, состояние 1, строка 8 Неверный синтаксис рядом с ключевым словом "группа".

Что не так с этим оператором 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)

Ответы [ 2 ]

2 голосов
/ 14 декабря 2010

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

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
1 голос
/ 14 декабря 2010

Для окончательного 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

Редактировать: переформулированный

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...