Как заказать запрос по полю, которое не выбрано - PullRequest
1 голос
/ 24 апреля 2019

Я nwbie to SQL-запросов и хранимых процедур, и я пытаюсь упорядочить запрос, где есть 3 внутренних объединения, но я получаю эту ошибку:

Элементы ORDER BY должны появляться в selectсписок, если указан SELECT DISTINCT.

Вот код запроса, который я пробовал:

SELECT DISTINCT
    P.ProductId,
    PID.IndexId
FROM
    Products AS P
INNER JOIN 
    #ProductIds AS PID ON P.ProductId = PID.ProductId
INNER JOIN 
    ProductStores AS PS ON P.ProductId = PS.ProductId
ORDER BY 
    CASE PS.Status 
       WHEN 1 THEN 1 
       ELSE 2 
    END 
    OFFSET (@PageIndex * @PageSize) ROWS 
    FETCH NEXT (@PageSize) ROWS ONLY;

Когда я удаляю отдельное ключевое слово, строки повторяются много раз

Ответы [ 2 ]

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

Ваши результаты заинтересованы только в показе полей, которые поступают из Products и #ProductIds - (ProductId и IndexId) - однако вы затем присоединяетесь к третьей таблице, которую вы пытаетесь заказать по (* 1005)*).

Если у вас есть ProductId, с которым связано 100 ProductStores, то DISTINCT покажет вам, что one ProductId независимо поля ProductStores.Status.

Может быть, лучше спросить вас - какой ответ вы хотите?

Я предполагаю, что вы хотите перечислить продукты, которые имеют Status = 1связано с ними в первую очередь.Однако, похоже, ничто не помешает ассоциированию Продукта с и Status = 1 магазином и Status = 0 магазином.Вот почему SQL не может дать вам ответы в этом случае - когда вам требуется по одной строке для каждого продукта.

Чтобы упорядочить по статусу, вам потребуется вывести его.Однако тогда вы получите строку для каждой комбинации Product, Index, Status. Ответ

@ mimamiq может работать без внешнего SELECT ...

SELECT DISTINCT 
    P.ProductId, 
    PID.IndexId, 
    PS.Status
FROM Products AS P 
    INNER JOIN #ProductIds AS PID ON P.ProductId = PID.ProductId 
    INNER JOIN ProductStores AS PS ON P.ProductId = PS.ProductId
ORDER BY 
    CASE tb.Status WHEN 1 THEN 1 ELSE 2 END
OFFSET (@PageIndex * @PageSize) ROWS FETCH NEXT (@PageSize) ROWS ONLY;

Но обратите внимание - если вы хотите одна строка для каждой комбинации продукта / продукта - тогда это не сработает (если в вашей базе данных нет других ограничений, о которых мы не знаем).

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

Try it ...

SELECT * FROM (
    SELECT DISTINCT 
    P.ProductId, 
    PID.IndexId, 
    (CASE tb.Status WHEN 1 THEN 1 ELSE 2 END) AS Status
FROM Products AS P 
    INNER JOIN #ProductIds AS PID ON P.ProductId = PID.ProductId 
    INNER JOIN ProductStores AS PS ON P.ProductId = PS.ProductId ) as tb
ORDER BY tb.Status OFFSET (@PageIndex * @PageSize) ROWS FETCH NEXT (@PageSize) ROWS ONLY;

Потому что оператор order by выполняется после оператора select.И когда два разных столбца могут быть включены различия статуса.Это означает, что это два ряда.1-й ряд 1 (ProductId), 2 (IndexId), 1 (Status) и 2-й ряд 1 (ProductId), 2 (IndexId), 2 (Status).Когда вы получите первый отчетливый два столбца.Возвращает только 1 строку, но какой статус?Но вы добавляете столбец статуса, тогда он знает столбец статуса индивидуально.

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