2010-01-06 4 views
6

SQL 쿼리를 작성할 때 "단일 쿼리로 수행 할 수있는 방법이 없습니다"라는 생각을 자주합니다. 그런 일이 발생하면 필자는 종종 임시 테이블 (일종의 테이블)을 사용하는 저장 프로 시저 또는 다중 명령문 테이블 반환 함수를 사용하여 결과를 결합하고 결과 테이블을 반환하기 만합니다.SQL 쿼리 이론 질문 - 단일 명령문 대 다중 명령문 쿼리

만약 이론상 문제가 없다면, 이 단일 결과 집합을 반환하는 ANY 쿼리를 작성할 수 있는지 궁금합니다 (다중 명령문이 아님). 분명히, 코드 가독성 및 유지 관리 가능성, 쿼리 성능/효율성과 같은 관련 사항을 무시합니다. 이것은 이론에 관한 것입니다. - 할 수 있습니까? 걱정하지 마십시오. 모든 경우에 다중 문장이 제 목적에 더 잘 부합 할 때 단일 명령문 쿼리를 작성하지 않으려 고합니다. 하나의 쿼리에서 결과를 얻을 수있는 실행 가능한 방법이 있는지에 대해 두 번이나 조금 더 생각하게 만들 수 있습니다.

필자는 몇 가지 매개 변수가 순서대로 있다고 가정합니다. - 기본 키가있는 모든 테이블과 같은 일반적인 모범 사례를 따르는 테이블을 사용하여 관계형 데이터베이스 (예 : MS SQL)를 생각합니다.

참고 : (. 웹 재료 또는 이와 유사한 참조)이를 '허용 대답'을 이기기 위하여, 당신은 결정적인 증거를 제공해야합니다

+0

... 또는 반대 사례. –

+0

이 질문에 답하기 전에 "이론 상 SQL"이 무엇을 의미하는지 훨씬 더 구체적이어야합니다. 실제로 사용되는 SQL은 DBMS와 DBMS 버전에 따라 다릅니다. 표준 SQL 구문 집합을 표준화해야합니다. 예 : 어떤 유형의 하위 쿼리를 허용합니까? 또한 SQL의 추상화로서 관계형 수학이나 대수를 사용하는 가장 일반적인 "SQL 쿼리 이론"과 같은 세부 정보를 추상화하여 표를 정렬 된 행 목록이 아닌 행 집합으로 취급 할 수 있습니다. – reinierpost

답변

2

적어도 오라클의 최신 버전은 절대적으로 가능합니다. SQL 튜링을 완성시키는 '모델 조항'이 있습니다. (http://blog.schauderhaft.de/2009/06/18/building-a-turing-engine-in-oracle-sql-using-the-model-clause/). 물론 이것은 우리가 정말로 무한한 시간과 기억을 가지지 않는다는 일반적인 한계를 가지고 있습니다.

이러한 복부가없는 일반적인 SQL 방언의 경우 가능하지 않다고 생각합니다.

내가 '정상 SQL'이 될 것으로 구현하는 방법을 볼 수있는 작업 : 모든 행 를 들어 정수 유형

의 단일 컬럼 테이블을 가정 '현재 행에있는 값을 그 많은 행을 되돌리고, 그 값을 가져오고, 그 많은 행을 되돌려 놓고, 같은 값을 두 번 연속적으로 가져올 때까지 계속해서 그 결과로 되돌립니다. '

+0

와우는 매우 흥미 롭습니다 ... 그러나 이것이 내게는 (비록 올바르게 이해한다면) 이것이 단일 진술이지만 결과 테이블을 반복 할 수 있다는 점에서 제 질문의 정신에는 그다지 중요하지 않다고 생각됩니다. 나는 "집합 이론"의 줄을 더 생각하고 있었다고 생각한다. 그럼에도 불구하고 이것이 Turing-complete 상태를 달성한다는 사실과 대부분의 SQL (MSSQL을 의미한다고 가정하고 있음)이 "아마 그렇지 않다"라는 사실에 대한 언급은 내가 승리했다고해도 충분하다고 생각합니다. 아직도 내 "진짜"질문에 대한 최종 답변이 무엇인지 확실하지 않습니다. –

3

나는 가능하다 생각합니다. 나는 매우 어려운 쿼리, 매우 긴 쿼리로 작업했으며, 종종 단일 쿼리로 수행 할 수 있습니다. 그러나 대부분의 경우, 다루기가 더 어렵습니다. 따라서 단일 쿼리로 수행하는 경우 쿼리를 신중하게 주석 처리해야합니다.

나는 한 번의 쿼리로 수행 할 수없는 것을 발견하지 못했습니다.
하지만 때로는 둘 이상의 쿼리에서이를 수행하는 것이 가장 좋습니다.

+0

몇 가지 정보를 추가하려면 : 내 직업에는 백업이 60을 초과하는 데이터베이스가 있습니다. 우리는 매우 큰 테이블과 매우 큰 데이터로 작업합니다. 작업 유형에 따라 쿼리가 많은 페이지를 처리 ​​할 수 ​​있으므로 둘 이상의 쿼리를 수행하거나 작업 테이블을 사용하는 것이 가장 좋습니다. –

+0

'querie do many pages'란 무엇을 의미합니까? –

+0

나는 당신이 당신의 프로그램 (나는 C++로 작업)에 그것을 쓸 때, 쿼리가 끝나기 전에 많은 페이지를 스크롤 다운해야한다는 것을 의미한다. –

2

나는 그것을 증명할 수는 없지만, 당신의 데이터베이스 디자인이 적절하게 수행 되었다면, 그 대답은 신중한 예라고 믿습니다. 일반적으로 특정 결과를 얻기 위해 여러 명령문을 작성해야하는 것은 스키마가 약간의 개선이 필요할 수 있다는 신호입니다.

2

"예"라고 말하고 싶지만 증명할 수는 없습니다. 그러나 내 주요 생각 과정 :

  • 모든 선택해야 할 일련의 작업 방식

  • 당신의 가정은 당신이

  • 설정 이론 (즉, 제대로 정규화) 수학적으로 정확한 세트를 다루고 있다는 점이다 보장해야한다 그것은

다른 생각을 가능 :

  • 여러 SELECT 문은 종종 임시 테이블/테이블 변수를로드합니다. CTE에서 파생되거나 분리 될 수 있습니다.

  • (좋고 나쁨에 대한) 모든 RBAR 처리 지금 처리 될 CROSS/OUTER 파생 테이블

    에 적용
  • UDF에가 당신이 넣을 수 있기 때문에, 내가 느끼는 이런 맥락에서 "부정 행위"로 분류 될 수 사항 다른 모듈에보다는에 SELECT 당신의 하나 하나

  • 없음이 DML의 순서 "전에"에서 허용 쓰기가

  • :

  • 을 선택이 SELECT에서 상태를 변경 당신이 우리 가게에서 코드의 일부를 본 적이 ?

편집, 용어

편집 : 적용 : 부정 행위?

SELECT 
    * 
FROM 
    MyTable1 t1 
    CROSS APPLY 
    (
     SELECT * FROM MyTable2 t2 
     WHERE t1.something = t2.something 
    ) t2 
+0

rbar, cte 및 udf는 무엇입니까? –

+0

방금 ​​'적용'에 대한 내용을 읽었을 때 나에게도 바람을 피 웁니다. 그것은 실제로는 SQL 엔티티가 아닌 T-SQL 또는 호출 된 모든 기능을 호출합니다. –

1

이론적으로 네가 기능이나 외계인의 미로 같은 외계인이나 하위 쿼리를 사용한다면; 그러나 가독성과 성능을 위해 항상 임시 테이블과 다중 문 저장 프로 시저를 사용했습니다.

위의 누군가가 주석을 달았 기 때문에 이것은 일반적으로 데이터 구조가 냄새가 나기 시작한다는 신호입니다. 이 좋지 않다.이 아니라 성능상의 이유로 인해 비정상 화되거나 (비정상적으로 발생하는 경우) 정규화 된 "실제"데이터 앞에 비정규 화 된 쿼리 레이어를 추가해야 할 때가왔다.