2015-01-07 5 views
0

DbCommand classExecuteReader 명령을 사용하여 SQL 쿼리를 실행하고 있습니다.임의의 순서로 결과를 반환하는 ExecuteReader

SQL 쿼리는이 같은 같습니다 나는 SQL Server 관리 Studio에서이 SQL을 실행하면

SELECT col_A, col_B, col_C 
FROM Table_A 

UNION 

SELECT col_A, col_B, col_C 
FROM Table_B 

UNION 

SELECT col_A, col_B, col_C 
FROM Table_C 

는 항상 위의 순서로 결과를 반환을, 즉 Table_A 먼저, Table_B 등 뒤에

그러나이 동일한 쿼리를 실행하기 위해 ExecuteReader() 메서드를 사용하면 임의의 순서로 결과가 반환됩니다.

왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?

편집 : 사람들은 SQL에서 순서를 보장 할 수는 없지만 SQL Server Management Studio에서 쿼리를 실행할 때마다 지정된 순서로 다시 돌아옵니다.

+3

'ORDER BY' 절이 없으면 SQL은 고유 한 순서를 보장하지 않습니다. – Michael

+0

SQL MS에서 특정 순서로 결과를 얻는 것은 구현 세부 사항입니다. 그러나 나는 ADO.Net을 통해 같은 명령을받지 못한다는 사실에 놀랐습니다. 그럼에도 불구하고 귀하의 질의는 본질적으로 특정 주문을 보장하지 않습니다. – juharr

+1

SQL Server Mgmt Studio가 항상 해당 주문을 반환하는 경우 - 행운의 ** 우연의 일치 **입니다. 진지하게 : *** ***없이 명시 적'ORDER BY', *** 보장 된 주문 ***이 없습니다 ..... 단지'ORDER BY'를 추가하면 주문을받습니다! –

답변

4

이 쿼리의 결과가 특정 순서로 유지된다는 보장은 없습니다. 특정 순서로 나타나게하려면 결과를 명시 적으로 주문해야합니다.

결과에 대한 순서가 정의되지 않은 일부 연산 결과의 순서에 패턴이 있음을 알게되었다고해서 이 모든 패턴에서 해당 패턴을 유지해야한다는 것을 의미하지 않습니다.

2

귀하는 지정된 순서대로 각 테이블에서 행을 얻을 수 있도록하기 위해

SELECT col_A, col_B, col_C, 1 As desiredOrder 
FROM Table_A  
UNION  
SELECT col_A, col_B, col_C, 2 As desiredOrder 
FROM Table_B  
UNION  
SELECT col_A, col_B, col_C, 3 As desiredOrder 
FROM Table_C  
Order By desiredOrder 

에 쿼리를 변경할 수 있습니다. 그러나 이것은 각 테이블에서 리턴 된 행의 순서를 보장하지는 않습니다.

반환 된 결과에 여분의 주문 열이 표시되지 않도록하려면 다음을 따르십시오. 문제를 해결할 수없는

Select * from (
SELECT '0' as col_Index, col_A, col_B, col_C 
FROM Table_A 
UNION 
SELECT '1' as col_Index, col_A, col_B, col_C 
FROM Table_B 
UNION 
SELECT '2' as col_Index, col_A, col_B, col_C 
FROM Table_C) Table_Union 
Order by col_Index 

I 미안 경우 :

SELECT col_A, col_B, col_C 
FROM 
    (Select col_A, col_B, col_C, 1 As desiredOrder 
    FROM Table_A  
    UNION  
    SELECT col_A, col_B, col_C, 2 As desiredOrder 
    FROM Table_B  
    UNION  
    SELECT col_A, col_B, col_C, 3 As desiredOrder 
    FROM Table_C) As UnionQuery 
Order By desiredOrder 
1

나는이 문제를 해결한다.

감사합니다.

+0

하위 쿼리로 유니온을 수행 할 필요는 없습니다. 유니온 종료시 주문 주문을 추가 할 수 있습니다. – juharr

+1

@juharr 두 솔루션 모두 열에서 순서를 반환해야합니다. 제공된 코드의'* '가'col_A, col_B, col_C'로 바뀌면 이것이 바람직한 행동 과정이라고 생각합니다. – Michael

+0

@Michael 그건 좋은 지적이야. – juharr

관련 문제