UFO ET IT

하위 쿼리에서 정렬 기준이있는 SQL 오류

ufoet 2020. 11. 22. 20:58
반응형

하위 쿼리에서 정렬 기준이있는 SQL 오류


SQL Server 2005를 사용하고 있습니다.

내 질문은 다음과 같습니다.

SELECT (
  SELECT COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay

그리고 오류 :

ORDER BY 절은 TOP 또는 FOR XML도 지정되지 않는 한 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다.

ORDER BY하위 쿼리에서 어떻게 사용할 수 있습니까?


이것은 당신이 얻는 오류입니다 (강조 표시).

ORDER BY 절은 TOP 또는 FOR XML도 지정되지 않는 한 뷰, 인라인 함수, 파생 테이블, 하위 쿼리 및 공통 테이블 식에서 유효하지 않습니다 .

그렇다면 오류를 어떻게 피할 수 있습니까? TOP을 지정하면 하나의 가능성이 될 것 같습니다.

SELECT (
  SELECT TOP 100 PERCENT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay

order by가 쿼리에서 의미가없는 것 같습니다 .... sub select에서 order by를 사용하려면 TOP 2147483647을 사용해야합니다.

SELECT (
  SELECT TOP 2147483647
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id
) as dorduncuay

내 이해는 "TOP 100 PERCENT"가 SQL 2005부터 더 이상 주문을 보장하지 않는다는 것입니다.

SQL Server 2005에서 뷰 정의의 ORDER BY 절은 TOP 절에서 반환하는 행을 확인하는 데만 사용됩니다. ORDER BY 절은 ORDER BY가 쿼리 자체에 지정되지 않는 한 뷰를 쿼리 할 때 정렬 된 결과를 보장하지 않습니다.

참고 SQL Server 2005를 차단 변경

도움이 되었기를 바랍니다, Patrick


SQL Server 2012 이상으로 작업하는 경우 이제 쉽게 수정할 수 있습니다. 추가 offset 0 rows:

SELECT (
  SELECT
  COUNT(1) FROM Seanslar WHERE MONTH(tarihi) = 4
  GROUP BY refKlinik_id
  ORDER BY refKlinik_id OFFSET 0 ROWS
) as dorduncuay

하위 쿼리에서 order by가 필요하지 않습니다. 기본 쿼리로 이동하고 정렬 할 열을 하위 쿼리에 포함합니다.

그러나 귀하의 쿼리는 단지 개수를 반환하므로 주문의 요점이 보이지 않습니다.


하위 쿼리에 Top 명령 추가 ...

SELECT 
(
SELECT TOP 100 PERCENT 
    COUNT(1) 
FROM 
    Seanslar 
WHERE 
    MONTH(tarihi) = 4
GROUP BY 
    refKlinik_id
ORDER BY 
    refKlinik_id
) as dorduncuay

:)


아마도이 트릭이 누군가를 도울 것입니다

SELECT
    [id],
    [code],
    [created_at]                          
FROM
    ( SELECT
        [id],
        [code],
        [created_at],
        (ROW_NUMBER() OVER (
    ORDER BY
        created_at DESC)) AS Row                                 
    FROM
        [Code_tbl]                                 
    WHERE
        [created_at] BETWEEN '2009-11-17 00:00:01' AND '2010-11-17 23:59:59'                                  
        )  Rows                          
WHERE
    Row BETWEEN 10 AND    20;

여기에 created_at 필드로 정렬 된 내부 하위 쿼리 (테이블의 임의의 항목 일 수 있음)


이 예에서 순서는 정보를 추가하지 않습니다. 세트의 COUNT는 순서에 관계없이 동일합니다!

당신이 뭔가를 선택한다면 않은 사용 TOP 또는 FOR XML을 - 순서에 의존을, 당신은 오류 메시지를 알 수있는 것들 중 하나를 수행해야합니다


하위 쿼리 (중첩 된 뷰)는 호출 쿼리에서 주문할 수있는 데이터 세트를 반환합니다. 하위 쿼리 자체를 정렬하면 호출 쿼리의 결과 순서에 (신뢰할 수있는) 차이가 없습니다.

SQL 자체에 관해서는 : a) 단일 값을 반환하므로 주문할 이유가 없습니다. b) 어쨌든 단일 값만 반환하므로 하위 쿼리에 대한 이유가 없습니다.

여기에 문제를 해결하기 위해 알려주고 싶은 정보가 더 많이 있다고 생각합니다.


임시 테이블을 빌드하는 경우 임시 테이블 코드 블록 내부에서 외부로 ORDER BY 절을 이동합니다.

허용되지 않음 :

SELECT * FROM (
SELECT A FROM Y
ORDER BY Y.A
) X;

허용됨 :

SELECT * FROM (
SELECT A FROM Y
) X
ORDER BY X.A;

order by 절을 sub select 외부로 이동하고 sub select에서 order by 필드를 추가하십시오.



SELECT * FROM 

(SELECT COUNT(1) ,refKlinik_id FROM Seanslar WHERE MONTH(tarihi) = 4 GROUP BY refKlinik_id)
as dorduncuay 

ORDER BY refKlinik_id 


나를 위해이 솔루션도 잘 작동합니다.

SELECT tbl.a, tbl.b
FROM (SELECT TOP (select count(1) FROM yourtable) a,b FROM yourtable order by a) tbl

좋은 날

어떤 사람들에게는 하위 쿼리의 순서가 의심 스럽습니다. 정렬에 따라 일부 레코드를 삭제해야하는 경우 하위 쿼리의 order by를 사용해야합니다. 처럼

delete from someTable Where ID in (select top(1) from sometable where condition order by insertionstamp desc)

마지막 삽입 양식 테이블을 삭제할 수 있습니다. 실제로이 삭제를 수행하는 세 가지 방법이 있습니다.

그러나 하위 쿼리의 order by는 많은 경우에 사용될 수 있습니다.

아래 링크에서 하위 쿼리 검토에서 order by를 사용하는 삭제 방법

http://web.archive.org/web/20100212155407/http://blogs.msdn.com/sqlcat/archive/2009/05/21/fast-ordered-delete.aspx

i hope it helps. thanks you all


I Use This Code To Get Top Second Salary

I am Also Get Error Like

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

TOP 100 I Used To Avoid The Error

select * from ( select tbl.Coloumn1 ,CONVERT(varchar, ROW_NUMBER() OVER (ORDER BY (SELECT 1))) AS Rowno from ( select top 100 * from Table1 order by Coloumn1 desc) as tbl) as tbl where tbl.Rowno=2


For a simple count like the OP is showing, the Order by isn't strictly needed. If they are using the result of the subquery, it may be. I am working on a similiar issue and got the same error in the following query:

-- I want the rows from the cost table with an updateddate equal to the max updateddate:

    SELECT * FROM #Costs Cost
    INNER JOIN
    (
        SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
        FROM #HoldCosts cost
        GROUP BY Entityname, costtype
        ORDER BY Entityname, costtype  -- *** This causes an error***
    ) CostsMax
        ON  Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, Costs.costtype

-- *** To accomplish this, there are a few options:

-- Add an extraneous TOP clause, This seems like a bit of a hack:

    SELECT * FROM #Costs Cost
    INNER JOIN
    (
        SELECT TOP 99.999999 PERCENT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
        FROM #HoldCosts cost
        GROUP BY Entityname, costtype
        ORDER BY Entityname, costtype  
    ) CostsMax
        ON Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, Costs.costtype

-- **** Create a temp table to order the maxCost

    SELECT Entityname, costtype, MAX(updatedtime) MaxUpdatedTime
    INTO #MaxCost
    FROM #HoldCosts cost
    GROUP BY Entityname, costtype
    ORDER BY Entityname, costtype  

    SELECT * FROM #Costs Cost
    INNER JOIN #MaxCost CostsMax
        ON Costs.Entityname = CostsMax.entityname
        AND Costs.Costtype = CostsMax.Costtype
        AND Costs.UpdatedTime = CostsMax.MaxUpdatedtime
    ORDER BY Costs.Entityname, costs.costtype

Other possible workarounds could be CTE's or table variables. But each situation requires you to determine what works best for you. I tend to look first towards a temp table. To me, it is clear and straightforward. YMMV.


On possible needs to order a subquery is when you have a UNION :

You generate a call book of all teachers and students.

SELECT name, phone FROM teachers
UNION
SELECT name, phone FROM students

You want to display it with all teachers first, followed by all students, both ordered by. So you cant apply a global order by.

One solution is to include a key to force a first order by, and then order the names :

SELECT name, phone, 1 AS orderkey FROM teachers
UNION
SELECT name, phone, 2 AS orderkey FROM students
ORDER BY orderkey, name

I think its way more clear than fake offsetting subquery result.

참고URL : https://stackoverflow.com/questions/985921/sql-error-with-order-by-in-subquery

반응형