Ошибка синтаксиса SQL: не удалось связать идентификатор из нескольких частей для ROW_NUMBER () - PullRequest
0 голосов
/ 24 апреля 2019

Нужно решить это

Это для REST API, и мне нужно рассчитывать на каждую строку, чтобы я мог использовать его для целей нумерации страниц.

SELECT *
FROM   (SELECT ROW_NUMBER()
                 OVER (
                   ORDER BY sc.LEGACY_PARTY_ID) AS rownum,
               *
        FROM   (SELECT *,
                       ROW_NUMBER()
                         OVER (
                           ORDER BY sc.LEGACY_PARTY_ID) AS rownuminner
                FROM   (SELECT *
                        FROM   (SELECT sc.legacy_party_id,
                                       sc.practice,
                                       sr.risk_level
                                FROM   dbo.supplier sc
                                INNER JOIN dbo.risk sr
                                  ON sc.LEGACY_PARTY_ID = sr.LEGACY_PARTY_ID)AS z) AS a)AS c
        WHERE  rownuminner <= ?)c
WHERE  rownum > ?; 

Нужны элементы таблицы с row_number для каждой строки, но появляется эта ошибка:

Сообщение 4104, уровень 16, состояние 1, строка 21
Не удалось связать идентификатор из нескольких частей "sc.LEGACY_PARTY_ID".

Сообщение 4104, уровень 16, состояние 1, строка 20
Не удалось связать идентификатор из нескольких частей "sc.LEGACY_PARTY_ID".

Ответы [ 2 ]

4 голосов
/ 24 апреля 2019

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

SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY c.LEGACY_PARTY_ID) AS rownum,
             *
      FROM (SELECT *,
                   ROW_NUMBER() OVER (ORDER BY a.LEGACY_PARTY_ID) AS rownuminner
            FROM (SELECT *
                  FROM (SELECT sc.legacy_party_id,
                               si.supplier_name,
                               si.supplier_description,
                               sc.practice,
                               sc.category,
                               sc.subcategory,
                               sui.industry,
                               sr.risk_level
                        FROM mip.supplier_classification AS sc
                             INNER JOIN mip.supplier_info AS si ON si.legacy_party_id = sc.LEGACY_PARTY_ID
                             INNER JOIN mip.SUPPLIER_INDUSTRY AS sui ON sc.LEGACY_PARTY_ID = sui.LEGACY_PARTY_ID
                             INNER JOIN mip.SUPPLIER_RISK AS sr ON sc.LEGACY_PARTY_ID = sr.LEGACY_PARTY_ID) AS z ) AS a ) AS c
      WHERE rownuminner <= 10) AS c
WHERE rownum > 5;

Это все еще кажется слишком сложным. Глядя на это, он, вероятно, может быть гораздо проще записать как:

WITH CTE AS
    (SELECT sc.legacy_party_id,
            si.supplier_name,
            si.supplier_description,
            sc.practice,
            sc.category,
            sc.subcategory,
            sui.industry,
            sr.risk_level,
            ROW_NUMBER() OVER (ORDER BY sc.legacy_party_id) AS RN
     FROM mip.supplier_classification AS sc
          INNER JOIN mip.supplier_info AS si ON si.legacy_party_id = sc.LEGACY_PARTY_ID
          INNER JOIN mip.SUPPLIER_INDUSTRY AS sui ON sc.LEGACY_PARTY_ID = sui.LEGACY_PARTY_ID
          INNER JOIN mip.SUPPLIER_RISK AS sr ON sc.LEGACY_PARTY_ID = sr.LEGACY_PARTY_ID)
SELECT *
FROM CTE
WHERE RN <= ?
  AND RN > ?;
0 голосов
/ 24 апреля 2019

SELECT *
FROM   (SELECT ROW_NUMBER()
                 OVER (
                   ORDER BY c.LEGACY_PARTY_ID) AS rownum,
               *
        FROM   (SELECT *,
                       ROW_NUMBER()
                         OVER (
                           ORDER BY c.LEGACY_PARTY_ID) AS rownuminner
                FROM   (SELECT *
                        FROM   (SELECT sc.legacy_party_id,
                                       si.supplier_name,
                                       si.supplier_description,
                                       sc.practice,
                                       sc.category,
                                       sc.subcategory,
                                       sui.industry,
                                       sr.risk_level
                                FROM   mip.supplier_classification sc
                                       INNER JOIN mip.supplier_info si
                                               ON si.legacy_party_id = sc.LEGACY_PARTY_ID
                                       INNER JOIN mip.SUPPLIER_INDUSTRY sui
                                               ON sc.LEGACY_PARTY_ID = sui.LEGACY_PARTY_ID
                                       INNER JOIN mip.SUPPLIER_RISK sr
                                               ON sc.LEGACY_PARTY_ID = sr.LEGACY_PARTY_ID)AS z) AS a)AS c
        WHERE  rownuminner <= ?)c
WHERE  rownum > ?; 

Вы определили псевдоним c для внешних запросов и используете sc, чтобы он выдавал ошибку

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