2011-09-19 5 views
2

나는 목록을 가지고있다. Sometype 지금은 Measures.It도 열 이러한 필드를 가지고있다라는 내 DB에 테이블이 두 가지 속성DB에 목록 전달 및 표와 속성 결합하기

ModificationDate

Key

을 가지고있다.

모든 조치 (키가 일치해야 함) 및 Modiciationdate (목록에서)> ModiciationDate (테이블에서)를 얻고 싶습니다.

지금 당장 테이블에서 모든 측정 값을 가져 와서 앱에서 확인하고 있습니다. 어떻게 피할 수 있습니까?

p.s 나는 Nhibernate를 사용하고 있습니다. Sometype 실제로 내 app.I는 (그것뿐만 아니라 몇 가지 추가 속성을 가지고로 모두 동일 할 수 없습니다)

편집 측정 값 표에 매핑 다른 엔티티가에 엔티티 나는 목록이 경우입니다 필요 나는 어떤 종류의 유혹에 빠지면 질의는

select * from Measures A join TempTable B on A.Key=B.Key and A.ModificationDate < B.ModificationDate이 될 것입니다.

하지만 목록의 모든 값을 #table에 삽입하지 않고도 완료 할 수 있습니까?

+0

db "WHERE Measures.Key IN (...)"에 대한 표준 쿼리가 아닌가? –

+1

그게 내가 지금하고있는 일이야.하지만 그건 IN 절에 나와있는리스트와 일치하는 모든 척도를 결정 짓게 될거야. 나는 만족할 수있는 하나의 태도가 더 필요해. 수정 날짜가 더 커야합니다.모든 기록을 선택하고 앱 내부의 상태를 확인하는 대신 어떻게 수행합니까? –

답변

0

이 방법을 사용할 수 있습니다.

코드에서 desire sql을 생성하는 메소드를 작성하십시오.

private string BuildSQL(List<SomeType> param) 
      { 
       string res = string.Empty; 

       if (param != null && param.Count > 0) 
       { 
        foreach (SomeType type in param) 
        { 
         res += " (A.Key='" + type.Key + "' AND A.ModificationDate < '" + type.ModificationDate + "') OR"; 
        } 
       } 
    if(!string.IsNullOrEmpty(res)) 
{ 
res = res.Substring(0, res.Length - 3); 
} 
       return res; 
      } 

하고, 단지 호출 함수 (아마도 DAO 클래스)로 전달이 SQL :

문자열을 sqlString = "측정 A로부터 선택 * 여기서"+ BuildSQL (PARAM); OdbcCommand.CommandText = sqlString; OdbcCommand.executeNonQuery();

Hth.

0

이전에이 문제가있었습니다. 내가 과거에 사용한 것은 문자의 목록 (csv라고 가정 해 봅시다)을 가져 와서 사용할 수있는 임시 테이블 변수로 바꿀 수있는 데이터베이스 끝의 함수입니다.

이 기능의 예는 다음과 같습니다

FUNCTION ListToTable 
( @SEP char(1), 
    @LST varchar(max) 
) RETURNS @TBL TABLE (idx int, txt varchar(max)) AS 
BEGIN 
    DECLARE @IX int, @POS int, @COUNT int, @STR varchar(max) 
    SET @POS = 1 
    SET @IX = 1 
    SET @COUNT = 0 
    WHILE @IX > 0 
    BEGIN 
     SET @IX = charindex(@SEP, @LST, @POS) 
     IF @IX > 0 
     SET @STR = substring(@LST, @POS, @IX - @POS) 
     ELSE 
     SET @STR = substring(@LST, @POS, len(@LST)) 
     SET @COUNT = @COUNT + 1 
     INSERT @TBL (idx, txt) VALUES(@COUNT, @STR) 
     SET @POS = @IX + 1 
    END 
    RETURN 
END 

그런 다음 쿼리를 수행 할 때 말할 수있다 :

SELECT * FROM 
Measures A 
INNER JOIN 
ListToTable(',', '1,1,2,3,5,8,...,21') B 
ON A.Key=B.Key 
AND A.ModificationDate < B.ModificationDate. 

을하면 ID가의 int를 만들기 위해 테이블에 대해 약간의 캐스팅을해야하는 경우 , 또는 무엇이든; 괜찮아. 이걸 HQL로 가져올 수 있을지 모르겠지만 쿼리로 잘 작동합니다.

+0

나는 이것에 대해서도 생각했다. 당신이 내 편집에서 볼 수있는 질문. 그러나 그것은 매우 고상한 소리가 아니며 또한 Nhibernate에서 이루어져야한다. –

+0

'Where in (#, #, ..., #) '조건부는 매우 실질적인 제한이 있습니다. 메모리 테이블이나 임시 테이블 설정을 사용하지 않는 한; 그 한계에 도달하면 쿼리가 어쨌든 작동하지 않습니다. –