Ошибка вложенного запроса в SQL Server 2008 - PullRequest
1 голос
/ 27 декабря 2011

Я получаю следующую ошибку

Msg 102, Level 15, State 1, Line 11
Incorrect syntax near ')'.

при попытке выполнить следующий запрос

SELECT COUNT(*)
  FROM tbl_usgGroupXref 
 WHERE GroupID = 478 
   AND accountNo IN (
           SELECT TOP 5000 accountNo
             FROM (
               SELECT DISTINCT accountNo 
                 FROM tbl_usgGroupXref 
                WHERE GroupID = 478
              )
       )

В настоящее время мой запрос состоит из серии вложенных запросов из одной таблицы tbl_usgGroupXref.Таблица состоит из нескольких месяцев записей для каждой учетной записи.Самый внутренний запрос состоит в том, чтобы получить различные учетные записи.Следующий внешний запрос - получить любые 5000 из этих учетных записей (я не могу объединить TOP с DISTINCT).И самый внешний запрос состоит в том, чтобы получить количество фактических записей, представленных счетами 5000.

Может ли кто-нибудь пролить свет на ошибку или пересмотреть этот sql, чтобы он работал?

Ответы [ 4 ]

3 голосов
/ 27 декабря 2011

Вам не нужно, чтобы подзапрос был настолько сложным, потому что IN игнорирует дубликаты.DISTINCT не требуется.

SELECT COUNT(*)
  FROM tbl_usgGroupXref 
 WHERE GroupID = 478 
   AND accountNo IN (
           SELECT TOP 5000 accountNo
             FROM tbl_usgGroupXref 
                WHERE GroupID = 478
       )

Однако TOP 5000 не имеет смысла, поскольку у вас нет ORDER BY, поэтому у вас есть 5000 произвольных строк.

3 голосов
/ 27 декабря 2011

Вы должны псевдоним этого подзапроса:

 FROM (
   SELECT DISTINCT accountNo 
     FROM tbl_usgGroupXref 
    WHERE GroupID = 478
  ) AS MySubQuery

Также следует отметить, что просто сказать TOP 5000 не гарантирует, что вы получите первые записи.

2 голосов
/ 27 декабря 2011

Вы должны назначить псевдоним для наиболее внутреннего выбора как:

SELECT COUNT(*)
  FROM tbl_usgGroupXref 
 WHERE GroupID = 478 
   AND accountNo IN (
           SELECT TOP 5000 accountNo
             FROM (
               SELECT DISTINCT accountNo 
                 FROM tbl_usgGroupXref 
                WHERE GroupID = 478
              ) ALIAS
       )

ИЛИ

объединить TOP и DISTINCT

SELECT COUNT(*)
  FROM tbl_usgGroupXref 
 WHERE GroupID = 478 
   AND accountNo IN (
           SELECT DISTINCT TOP 5000 accountNo
           FROM tbl_usgGroupXref 
           WHERE GroupID = 478
       )
1 голос
/ 27 декабря 2011

Вы также можете написать:

       SELECT TOP 5000 accountNo
         FROM (
           SELECT DISTINCT accountNo 
             FROM tbl_usgGroupXref 
            WHERE GroupID = 478
          )

как:

       SELECT TOP 5000 accountNo
       FROM tbl_usgGroupXref 
       WHERE GroupID = 478
       GROUP BY accountNo

и весь ваш запрос как:

SELECT SUM(cnt)
FROM 
  ( SELECT TOP 5000 
          COUNT(*) AS cnt
    FROM tbl_usgGroupXref 
    WHERE GroupID = 478
    GROUP BY accountNo
   ) grp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...