2009-04-22 2 views
0
나는 MS의 SQL DB를 사용하고

의 내부에 서로 다른 유형의 두 값을 비교 나는 3 개 테이블이 'base_info', '메시지', '설정'을가 하위 쿼리

bases: 
ID Name NameNum 
==================================== 
1 Home 101 
2 Castle 102 
3 Car  103 

messages: 
ID Signal RecBy HQ 
============================ 
111 120  Home  1 
111 110  Castle 1 
111 125  Car  1 
222 120  Home  2 
222 125  Castle 2 
222 130  Car  2 
333 100  Home  1 
333 110  Car  2 

config: 
ID SignalRec SignalOut RecBy HQ 
==================================== 
111  60  45  101 1 
111  40  60  102 1 
222  50  60  102 2 
222  30  90  101 2 
333  80  10  103 1 

좋아, 그래서 지금은 하위 쿼리가 내가 'SignalRec'과 'SignalOut'을 config 테이블에서 선택하고 ID와 Date (위의 것은 포함하지 않음)에 의해 메시지 테이블에서 일치 시키면, 문제는 그것이 어디에 일치해야하는지입니다. messages.RecBy = config.RecBy 하지만 config.RecBy는 문자열이지만 동등한 이름입니다. 기본 테이블에 있습니다. 그래서 나는 서브 쿼리 나 어떤 유형의 조인 안에서 서브 쿼리를 수행하고 리턴 된 값을 비교할 필요가 거의있다.

(SELECT TOP 1 config.SignalRec from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalRec, 
(SELECT TOP 1 config.SignalOut from config WHERE config.ID = messages.ID AND ||I need th other comparison here||...Order By...) As cfgSignalOut 

나는 가능한 한이 명확 만들려고하지만 당신은 더 많은 정보가 필요하면 알려주세요 : 여기
는 내가 지금까지 가지고있는 것입니다.

+0

나는 또한 이것에 대한 좋은 제목을 생각할 수 없었다. –

답변

0

에 가입해야합니다처럼 설명에서

2

기본 테이블을 참조하기 위해 메시지 테이블의 RecBy를 표준화했습니다. 베이스에서 참조되는 경우 왜 문자열 컨텐츠를 삽입합니까?

이것은 정규화가 존재하는 이유입니다. 중복성을 줄이고 모호성을 줄이며 참조 무결성을 적용합니다.

메시지 테이블의 RecBy가 Bases의 외래 키 여야합니다.

2
앤서니가 지적했듯이, 당신은 아마의 RecBy 열에서 문자열을 정상화 할

SELECT 
    c.SignalRec 
FROM config c 
    INNER JOIN bases b 
     ON c.RecBy = b.NameNum 
    INNER JOIN messages m 
     ON b.Name = m.RecBy 
WHERE c.ID = m.ID 

그러나 나는이 트릭을 할 수 있다고 생각

(나는 그것을 시도하지 않은 있지만 ...) messages 테이블, bases 테이블의 데이터가 동일합니다. 당신이 내가 내가 미안,하고 싶었던 것을 충분히 명확하지 않은 것 같아요

SELECT TOP 1 
    c.SignalRec 
FROM 
    config c 
INNER JOIN 
    bases b 
ON c.RecBy = b.NameNum 
INNER JOIN 
    messages m 
ON b.Name = m.RecBy 
+0

나는 정상화 할 수 없다. 하위 쿼리에서이 작업을 수행 할 수 있습니까? –

+0

내가 보여준 쿼리는 정규화하지 않고 작동해야합니다. 그렇지 않습니까? 어떤 오류/예기치 않은 결과가 있습니까? –

0

, 그냥 소리가 난다. 상관 관계는 동일하지만 데이터는 2 테이블에서 실제로 다릅니다. 시스템이 어떻게 작동하는지 자세히 설명하지 않고 설명하는 것은 혼란 스럽습니다.
나는 실제로 이것을하는 매우 빠른 방법을 발견했다. 내 하위 쿼리 내부
나는이 작업을 수행 :

(SELECT TOP 1 config.Signal FROM config,bases 
    WHERE config.ID = messages.ID AND bases.Name = messages.RecBy AND bases.NameNum = 
    config.RecBy Order By...) 

그래서이 본질적으로 비록 하나의 정수이고, 다른 하나는 문자열입니다 다른 테이블의 2 RecBy 년대를 비교합니다. 그것은 나에게 매치를 생각 나게하고 Excel에서 찾아 본다.

+0

하위 쿼리 내부에서이 작업이 가능합니까? –

+0

하위 쿼리 내부에서이 작업이 가능합니까? - 네. –