2016-06-08 4 views
1

다음과 같은 sql이 있습니다. sql-server에서 작동하지 않습니다. 왜냐하면 order by은 subselect에서만 허용되기 때문에 top과 같은 키워드를 사용할 때입니다.sql-server and oracle-subselect에서 주문하십시오.

SELECT DISTINCT * 
    FROM (SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort 
     FROM pgrdat 
     WHERE man = 'XYZ' 
     ORDER BY pst_ab DESC) 

원하는 결과를 얻으려면 어떤 방법이 있습니까? SQL은 오라클에서도 작동해야합니다.

"pst_ab"이없는 모든 필드에서 구분하고 싶지만 동시에 "pst_ab"로 주문하고 싶습니다.

일시적인 해결책은 subselect를 통해 주문을 사용하고 소스 코드가 모든 pnr- 숫자를 한 번만 가져 오도록하는 것입니다.

고마워요.

답변

1

테이블 자연 정렬되지 않은, 그리고 정렬되지 않은 상태로 그래서 from 절 내에서 사용되는 모든 것이 고려된다.
top 키워드를 사용하는 경우가 아니면 SQL Server에서 파생 테이블에 order by 절을 사용할 수 없습니다.

자, 여러분의 곤경을 이해합니다. 한편으로는 pst_ab 열을 포함하지 않는 고유 값을 원하지만 다른 한편으로는 같은 열에 의해 값이 정렬되기를 원합니다.

다행히, 당신은이에 대한 ROW_NUMBER() 윈도우 기능을 사용할 수 있습니다 :

ROW_NUMBER
SELECT pnr, 
     naname, 
     vorname, 
     gebdat, 
     p_alter, 
     geschl, 
     gebort 
FROM (
    SELECT pnr, 
      naname, 
      vorname, 
      gebdat, 
      '' p_alter, 
      geschl, 
      gebort, 
      ROW_NUMBER() OVER(PARTITION BY pnr, 
              naname, 
              vorname, 
              gebdat, 
              geschl, 
              gebort 
           ORDER BY pst_ab DESC) RowNumber 
    FROM pgrdat 
    WHERE man = 'XYZ' 
) d 
WHERE RowNumber = 1 

DISTINCT 기능을 제공 할 것입니다 외부 쿼리에서 pst_ab에 의한 결과와 WHERE 절을 정렬합니다.

SQL 서버에서 테스트 한 결과 오라클에서 똑같이 작동해야한다고 생각하지만 테스트 할 방법이 없습니다.

+0

나는 그것을 고맙게 생각할 것이다. 내 설명은 다음번에 더 좋아야한다. –

+0

필자는 oracle을 다른 예제와 함께 시험해 보았다. 거기에서도 작동한다. 내일은 생산 시스템에서 최종 결과를 테스트 할 수있다. –

+0

도와 줘서 기쁩니다 :-) –

0

별개 및 주문을 다음과 같이 변경하십시오.

SELECT * 
FROM (
    SELECT DISTINCT 
     pnr 
     ,naname 
     ,vorname 
     ,gebdat 
     ,'' p_alter 
     ,geschl 
     ,gebort 
     ,pst_ab 
    FROM pgrdat 
    WHERE man = 'XYZ' 
    ) 
ORDER BY pst_ab DESC 

그런 식으로 여전히 고유 목록을 얻고 있으며 올바르게 주문되었습니다. 물론 내부 선택에 pst_ab 필드를 포함시켜야합니다. 결과에서 이것을 원하지 않으면 이것을 시도하십시오.

SELECT DISTINCT 
pnr 
,naname 
,vorname 
,gebdat 
,p_alter 
,geschl 
,gebort 
FROM (
    SELECT DISTINCT 
     pnr 
     ,naname 
     ,vorname 
     ,gebdat 
     ,'' p_alter 
     ,geschl 
     ,gebort 
     ,pst_ab 
    FROM pgrdat 
    WHERE man = 'XYZ' 
    ) 
ORDER BY pst_ab DESC 
0

당신은 부속에서에 의해 ORDER를 당길 필요가있다. 관계형 데이터베이스에서

SELECT DISTINCT * 
    FROM (SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort, pst_ab 
     FROM pgrdat 
     WHERE man = 'XYZ') 
ORDER BY pst_ab DESC 
+0

이렇게하면 pst_ab에 의해 정렬 된 모든 필드에서 모든 가능한 조합을 얻을 수 있습니다. 그게 내가 원하는 걸 그게 아니야. subselect에서 "pst_ab"필드를 선택하지 않고 "현재 하나"만 얻을 것인가? –

+0

주문할 하위 쿼리가 두 개 이상있는 경우 * pst_ab * 앞에 다른 열을 추가 할 수 있습니다. –