2013-10-08 2 views
-1

이 질문은 그러나 데이터베이스 구조에 약간의 변화가있다이 question복잡한 SQL 쿼리</p> <p>나는 데이터베이스를 가지고 (나는 약간 단순화 이상으로)

에서 연속이다 쿼리 데이터 열을 다음과 같이

Key, Instance, User ID, Day, Size, Instance Type 

- 이것은 기본 키입니다.
인스턴스 - 이것은 특정 인스턴스의 설명 자입니다 (고유 할 것입니다).
사용자 ID -이 숫자는이 테이블의 항목 수보다 적은 수의 사용자 중 1 명을 나타냅니다.
- 특정 사용자가이 인스턴스를 만든 날입니다. 1 일 또는 2 일 중 하나가됩니다.
크기 - 이것은 저장된 데이터의 크기입니다.
인스턴스 유형 - 인스턴스 유형이 여러 개 있습니다. 인스턴스 자체가 이러한 인스턴스 유형 중 하나가됩니다.

내 앞의 질문에서 중첩 된 SQL 쿼리를 작성하여 하루 1 일과 2 일에 인스턴스가 있고이 경우 특정 인스턴스 유형이있는 고유 한 사용자를 찾습니다.

이제 두 세트의 쿼리가 있습니다.

내가 지금하고 싶은 것은 세 번째 쿼리이며 사용자 ID이 다른 쿼리에 존재하지 않는 데이터베이스를 반환합니다.

지금까지 내가 쿼리를 설정 한하지만 정말 느린 ( ON 문 < 함께 할 수있는 뭔가>는 의 비교) 내가 정확히 내가 원하는하지 않습니다 심지어 100 % 확신한다.

이 지금까지 내 SQL 문입니다 :

Select Max(Table.Key) as Key, 
     Max(Table.Instance) as Instance, 
     Table.[User ID], 
     Max(Table.Day) as Day, 
     Max(Table.Size) as Size, 
     Max(Table.[Instance Type]) as [Instance Type] 
from (((Table 
     inner join (Select top 90 Max(Table.Key) as Key, 
            Max(Table.Instance) as Instance, 
            Table.[User ID], 
            Max(Table.Day) as Day, 
            Max(Table.Size) as Size, 
            Max(Table.[Instance Type]) as [Instance Type] 
        from Table 
        where Table.[Instance Type]="type1" and 
          Table.[Day]=1 and 
          1=1 
        group by Table.[User ID]) as t2 
     on Table.[User ID]<>t2.[User ID]) 
     inner join (Select top 90 Max(Table.Key) as Key, 
            Max(Table.Instance) as Instance, 
            Table.[User ID], 
            Max(Table.Day) as Day, 
            Max(Table.Size) as Size, 
            Max(Table.[Instance Type]) as [Instance Type] 
        from Table 
        where Table.[Instance Type]="type1" and 
          Table.[Day]=2 and 
          1=1 
        group by Table.[User ID]) as t3 
     on Table.[User ID]<>t3.[User ID]) 

     inner join (Select Table.[User ID] 
        from Table 
        where 1=1) as t4 
     on Table.[User ID]=t4.[User ID]) 
where Table.[Instance Type]="type1" 
group by Table.[User ID]; 

나는 대규모 감사하겠습니다 후에 해요 무엇을하는 방법에 어떤 도움이나 조언!

+1

"나는 100 % 확실하게 필요." - 뭐라고? –

+0

@MitchWheat : 나는 사용자 ID가 일치하지 않는 항목을 제외하는 것이 좋다고 100 % 확신하지는 않습니다. – Goz

답변

1

성능 조정을 임시 테이블로 채우는 것부터 시작하는 것이 더 쉽습니다 (MS-Access에서는 '보기'또는 '테이블 만들기'라고 생각합니다. 특히 논리가 지나치게 복잡해 보이기 때문에 어렵습니다. 유지 보수 및 디버그!) :

질문 1 : "이제는 이전 질문에서 중첩 된 SQL 쿼리를 작성하여 1 일과 2 일에 인스턴스가있는 개별 사용자를 찾고이 경우에는 특정 인스턴스 유형. "

먼저 임시 테이블/테이블 만들기 또는 '보기'또는 다른 방법으로 (구현 방법에 따라 먼저 해당 날짜의 고유 한 사용자 ID 목록을 가져 오는 것이 좋습니다. .

SELECT DISTINCT Table.UserID, Table.Day 
INTO #DistinctListOfUserIDsWithDays /* Not sure of exact syntax in access! */ 
FROM Table 
WHERE Table.Day = 1 
OR Table.Day = 2 

그리고 당신은 위의보기/쿼리의 결과를 집계 및 HAVING 절을 사용하여, 쉽게 첫 번째 부분을 해결하는, 모두 일에 대한 데이터가 모든 사용자가 얻을 수 있습니다 :

SELECT Table.UserID, COUNT(*) 
FROM #DistinctListOfUserIDsWithDays 
HAVING COUNT(*) > 1 
Now I have 2 sets of these queries. 

re : 새 쿼리 "지금부터하고 싶은 것은 세 번째 쿼리로 사용자 ID가 다른 쿼리에 존재하지 않는 데이터베이스를 반환합니다."원본 쿼리/뷰를 기반으로 한 간단한 솔루션입니다. 위 :

SELECT Table.UserID 
FROM Table 
WHERE UserID NOT IN (SELECT UserID FROM #DistinctListOfUserIDsWithDays) 

테이블과 함께 #DistinctListOfUserIDsWithDays를 외부 조인하고 쿼리의 #DistinctListOfUserIDsWithDays 측면에서 NULL을 반환하는 사용자 ID 만 선택하십시오 ...

+0

그것의 생각은 있었지만 실제로는 하나의 모 놀리 식 SQL select 문을 만들 수 있기를 바랬습니다 (긴 이야기지만 나중에 저장하는 데 유용 할 것입니다). 어떻게 든 SQL 쿼리의 일부로 임시 테이블을 만드는 방법이 있습니까? – Goz

+0

일반 논리를 가져 와서 변환 할 수 있지만 아마도 가장 쉬운 방법은 원래 '임시 테이블'쿼리를 가져 와서 ms 액세스 '쿼리'개체로 변환 한 다음에 쿼리 개체를 사용하는 것입니다. SQL 쿼리 - 그래서 당신은 효과적으로 동일한 일을 할 것입니다 (예 : temp 테이블없이 하나의 SQL 쿼리 사용) –

+0

방금이 (내부 C# 개체를 사용하여) 시도로 변환했습니다 및 성능이 크게 증가하고 있어요 , 나는 그것이 SQL에서 가능하다고 생각하게 만든다. 그러나 만약 아무도 SQL 기반 대답이 나오면이 대답을 수락 할 것입니다 :) – Goz