2011-09-07 4 views
0

기본 키가 JobId 인 테이블이있는 SQL Azure 데이터베이스가 있습니다. 사용자는 하나 이상의 (아마도 10, 아마도 1 만) 값을 포함 할 수있는 배열로 "작업 ID"를 전송합니다. 나는 그것을 위해 SQL 쿼리를 작성하는 방법을 결정할 수 없다. .NET Framework 클래스를 사용합니다. 여기여러 값 중 하나와 동일한 열 값을 가진 행을 선택하는 SQL 요청을 작성하는 방법은 무엇입니까?

CREATE TEMP TABLE JobIdsTable 
foreach(JobId in JobIdsFromClients) { 
    INSERT INTO JobIdsTable VALUES (JobId) 
} 
SELECT * FROM JobsTable WHERE JobId IN SELECT * FROM JobIdsTable 

는 코드 작성의 관점에서 멋진 외모,하지만 난 잘 모르겠어요 : 나는 임시 테이블을 생성하고 WHERE IN 중첩 SELECT (의사 -like SQL + C#)를하고있다 참조

하나 개의 옵션 항상 빨리 달릴 것입니다.

또 다른 옵션이 형성 거대한 OR 연결을 생성하는 SELECT 거대한 : 여기

SELECT * FROM JobsTable WHERE JobId='JobId1' OR JobId='JobId2' OR JobId='JobId3' ..... 

이 하나 SELECT입니다하지만 합치의 생각이 (일반적으로 내가 만들 System.Data.SqlClient.SqlCommand.Parameters을 사용하십시오 문자열이 좋은 소리가 나지 않는다 갈망 매개 변수화 된 쿼리가 있지만 매우 복잡 할 것입니다. 또한 SQL 쿼리가 얼마나 오랫동안 지속될 수 있는지에 대해서는 확실하지 않습니다.

내 쿼리를 관리 가능하고 효율적으로 수행하고 싶습니다. 두 옵션의 단점을 참조하십시오.

어느 것을 선택합니까? 대신 다른 방법으로합니까?

+0

대략 얼마나 많은 JobIds가있을 것으로 예상하십니까? –

+0

@Sam : 목록이 소프트웨어로 생성되며 그 소프트웨어는 다른 사람들이 쓴 것이므로 실제로는 알 수 없습니다. – sharptooth

답변

2

임시 테이블과 함께 가고 싶지만 하위 쿼리 대신 조인을 사용하십시오. 이드의 열이 인덱싱 된 경우, 성능이 괜찮은해야 다음 jobIds을

SELECT * 
FROM JobsTable j 
INNER JOIN JobIdsTable jt ON j.JobId = jt.JobId 
+0

하나의 제안은 임시 테이블 대신 테이블 변수를 사용하는 것입니다. 좀 더 가벼운 솔루션이 될 것입니다. – sll

+0

실제로 쿼리 최적화 프로그램은 조인과 동일한 위치에서 실행이 동일하게 생성된다는 사실을 발견했습니다. select 문은 데이터를 검색하는 방법을 지정하지 않는 집합을 정의하기 때문입니다. –

+0

@Ben : 공정한 시점이지만, 잠재적으로 수천 개의 값을 가진 IN이 꽤 다루기 힘듭니다! – StevieG

2

, 나는 ID를 양식에서 오는 상상할 수없는 어디에서 온 10,000 정수에 사용자 유형.

이상적으로는 작업 테이블의 JobBatchId FK를 통해 ID를 그룹화하는 일종의 "JobBatch"테이블이나, "many to many"가있는 경우 job에 일괄 처리 작업을 할당하는 중간 JobBatchId 테이블이 이상적입니다. 그렇다면 ID를 생성하는 것은 무엇이든 "일괄 처리"를 생성해야하며 단일 ID 만 전달하면됩니다.

쉼표로 분리 된 목록을 단일 매개 변수로 전달한 다음 SP에서 분리하는 방법으로 문제를 해결할 수 있지만 10,000 개가 넘는 경우에는 잘못된 디자인으로 처리됩니다. Here은이 경로를 사용하려는 경우 분할 기능 모음입니다.

1

당신은 (대신 관찰 보고서의) ID의 긴 문자열을 연결하고 사용할 수있는 WHERE IN clausule 같은 :

SELECT * FROM JobsTable WHERE JobId IN (12343,454353,24354,20200/*,...so on...*/) 

이는 SQL 서버 관리 구축 빠르고 가볍고

IN 구문은 IN (3939)으로 원할 경우 하나의 값만 받아 들일 수 있으며 더러운 솔루션이 cero 카디널리티를 확인하지 않으려면 (0으로 연결을 시작하고 필요한만큼 ','+IDvalue을 추가하고 마지막으로 ) (0은 유효한 작업 ID)

관련 문제