2017-12-01 5 views
-1

이 항목은 약간 올랐지 만 내가 찾은 답변 중 아무 것도 저에게 효과가 없었습니다.LEFT 테이블에서 모든 행을 반환하지 않는 LEFT 조인

내가 1 30 아래 DATA라는 두 번째 테이블에서 값을 연결 열에 번호 중 하나를 열입니다 테이블 일에서 모든 값을 가지고 두 개의 테이블에 가입 할

:

Ref Week_Comm Date  Name   Adj_Type  Hours Description Sick_Note Deleted 

223 04-Apr-17 04-Apr-17 Joe Bloggs  Absence   4 Sickness RECD  
112 04-Apr-17 05-Apr-17 Joe Bloggs  Absence   7 Sickness RECD  
196 04-Apr-17 06-Apr-17 Joe Bloggs  Absence   7 Sickness RECD  
197 11-Apr-17 11-Apr-17 Fred Flintstone Holiday   7     

내 원하는 결과를

Day   April 
1 
2 
3 
4   A 4Hrs 
5   A 7Hrs 
6   A 7Hrs 
7 
8 
etc to 30 
연결이 잘 작동하지만 올바른 테이블과 일치하는 위치에서만 결과를 얻을 수 있습니다.

SQL을 Excel VBA에 문자열로 만들고 ODBC 연결을 사용하여 데이터를 반환합니다. 표는 동일한 스프레드 시트에 포함되어 있습니다.

내 첫 번째 시도는이 날 결과를 제공

SELECT DAYS.Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DAYS 
LEFT OUTER JOIN DATA ON (DAYS.Day = DAY(DATA.Date) 
WHERE (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) 
ORDER BY DAYS.Day 

을 다음과 같이이었다 내부 조인을 위해이 비슷한 질문에 내 왼쪽 테이블 일에서

다음 답변을 모든 값을 반환하지 않습니다 즉, 포럼 나는"지원되지 EXPRESSION 가입하기"로와이 데이터를 반환하지

SELECT DAYS.Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DAYS 
LEFT OUTER JOIN DATA ON ((DAYS.Day = DAY(DATA.Date) 
AND (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) 
ORDER BY DAYS.Day 

다음과 나는 오류로 WHERE 교체 시도

은 그때 그들에 가입 한 후 내 테이블에 원하는 데이터를 선택하고 시도 :

SELECT DAYS.Day 
FROM DAYS AS A 
LEFT JOIN (SELECT DAY(DATA.Date) AS Day, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs') as April 
FROM DATA 
WHERE (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Blogs')) as B 
ON A.Day = B.Day 

을 그리고 오류 메시지가

FROM 절

에서

구문 오류 나는 어디로 잘못 가고 있니? 나는 사전에

덕분에이 모든 아주 초보자이야와 구글을 통해 내 정보의 대부분을 얻을 - 저스틴

내가 여분의 별명을 편집 한 (위와 같이)하지만 여전히 같은 결과를 얻고있다 EDIT .

+0

당신의 테이블의 이름이 DAYS와 DATA 인 것 같습니다. 왜 FROM 절에서 DATA DATA와 DAYS DAYS를 반복합니까? – MarcinSzaleniec

+0

marcinszaleniec이 주석 처리 했으므로 특히이 라인을 평일부터 사용하면 두번 앨리어스가됩니다 – QHarr

+0

* right * 테이블을 참조 할 때마다 where 절이 아닌 join 절을 사용해야합니다. where 절의 오른쪽 테이블에 대해 필터를 사용하면 외부 조인이 내부 조인으로 바뀝니다. 일치하는 행이 있는지 여부를 알 수있는 유일한 방법이기 때문에 외부 조인을 내부 조인으로 바꿉니다. 물론 기본 구문을 먼저 이해해야합니다. 왜 당신은 일 (또는 일)로 에일리어싱을하고 있습니까? –

답변

0

이제 해결되었습니다. 내 질문에 두 번째 SQL 문을 실제로 올바른 있지만 왼쪽 된 테이블에서 내 연결된 문자열로 null 데이터를 가져오고 있었기 때문에 "null 잘못된 사용"오류로 인해 다시 데이터를 가져 오지 않았습니다. 나는 연결이 정상적으로 작동한다고 생각했지만, 이것은 WHERE의 잘못된 사용을 통해 Null 데이터를 제외시킨 문장에서만 발생했습니다.

여기 내 마지막 코드입니다.

SELECT DAYS.Day, IIF(DATA.Hours is null, DATA.Hours, (LEFT(DATA.Adj_Type,1) + ' ' + Cstr(DATA.Hours) + ' Hrs')) 
FROM DAYS LEFT OUTER JOIN DATA ON (DAYS.Day = DAY(DATA.Date) AND (MONTH(DATA.Date)=4) AND (DATA.Deleted Is Null) AND (DATA.Name='Joe Bloggs')) 
ORDER BY DAYS.Day 

앞으로 도움이 될 수 있기를 바랍니다.

0

두 번째 쿼리는 올바른 경로에 있으며, 조인 조건에서는 MONTH(DATA.Date)=4 만 사용할 수 있습니다. 대신 다음과 같이 WHERE 절로 다시 이동하십시오.

WHERE (MONTH(DATA.Date)=4 OR DATA.Date IS NULL) 
+0

감사합니다 ItsLex - 방금 다음을 시도했지만 아무런 데이터도 반환되지 않았습니다. '오늘 선택하십시오. 일로부터 LEFT JOIN (LEFT (DATA.Adj_Type, 1) + 'Cstr (DATA.Hours) +'Hrs ') 4 월 보낸 사람 WHERE (MONTH (DATA.DATE) = 4) 또는 (DATA.DATE IS NULL) AND (DATA.Deleted Is Null) AND (DATA.Name = 'Joe 블로그)) 으로 B A. Day = B.Day' –

+0

아니요, 세 번째 쿼리입니다. 그리고 OR 문을 둘러싼 괄호에 유의하십시오. – itsLex

+0

나는 내부 조인 값을 반환하는 WHERE (MONTH (DATA.DATE) = 4) AND (DATA.Deleted Is Null) AND (DATA.Name = 'Joe Bloggs') 또는 (DATA.Date IS NULL) 다시. –

관련 문제