2010-04-14 2 views
3

Google 검색 기술이 저를 실패 시켰으며 어떤 방법 으로든 데이터베이스 전문가가 아닙니다! 사탕 테이블에부울 논리를 사용하여 데이터베이스보기 만들기

database schema http://bit.ly/adeUVL

properties_id가 EXPENSIVE_PROPERTIES 테이블의 ID에 대한 외래 키 :이처럼 보이는 아주 간단한 데이터베이스 스키마를 가지고있다. properties_id는 캔디가 비싼 경우에만 으로 설정됩니다. 비싼 경우, 다음 EXPENSIVE_PROPERTIES 테이블의 해당 값이 채워 얻을 것이다

나는 사탕의 목록을 할 때, 나는 기본적으로이 작업을 수행 할 :.

  • 요청을 모두 이름과 색상 같은 사탕 테이블의 속성,
  • properties_id 값이, 나는 두 개의 쿼리를 수행했다,하지만 난 할 수 있어야하기 때문에이 바보 과거

null가 아닌 경우 선택적으로 고가의 속성을 가져 집계보기를 만들려면 모든 등록 정보를 하나의 테이블로 통합하고 EXPENSIVE_PROPERTIES 테이블에 해당 ID가없는 경우 다른 필드를 비워 둡니다.

누구나 SQLite에서이 뷰를 만드는 방법을 알려 줄 수 있습니까? 나는 그것이 가능하다고 생각하지만, from the docs 그것을 알아낼 수 :

alt text

IF NOT 요소가 특정 필드 값의 존재와 함께 할 아무것도하지 않는 것 존재한다. 내가 이상한 찾기 질문에 대한 답변이되었습니다

UPDATE,하지만 한 가지 경우에 I가 중복 된 항목을 볼 수 있다는 것입니다. 저는 SQLite Administrator를 사용하고 CREATE VIEW 문을 실행하고 결과 탭을 볼 때 고유 항목을 얻습니다. 방금 SELECT 문을 수행하면 중복 행이 생깁니다. 보기를 만든 다음 SELECT * FROM myview를 수행하면; 나 또한 중복 행을 참조하십시오. 누구든지 이것에 대해 밝힐 수 있습니까? 새로운 질문을 만들어야합니까?

업데이트 # 2

신경 쓰지 마, 내 실수를 발견 - 나는 후 중복을 야기하는 두 테이블을했다.

답변

3

기본 테이블의 일부 행에 대한 데이터가없는 다른 테이블에서 데이터를 검색하려면 LEFT OUTER JOIN을 사용할 수 있습니다.

create view vCandy as 
select c.id, c.name, c.color, c.properties, 
ep.chocolate, ep.gold_foil 
from Candy c 
left outer join Expensive_Properties ep on c.properties_id = ep.id 

IF NOT EXISTS

가 존재하지 않는 데이터 처리를 참조하지 않습니다. 오히려 이미 존재하지 않는다면 뷰를 생성한다는 의미입니다. 이 명령문을 두 번 이상 실행할 때 오류를 방지하기위한 것입니다.

+0

확인 candy.id = expensive_properties.id에 expensive_properties 가입 할 수 있습니다. 감사! 나는 전에 외부 조인을 사용하지 않았다. – Dave

+0

그게 효과가! 고맙습니다. – Dave

+0

한 번 더 질문하기 -이 방법이 효과가 있지만 왜 SELECT 문을 사용하여 (보기를 만들지 않고) 결과에 중복 행이 생깁니 까? – Dave

1

내가 SQLite는 익숙하지 해요,하지만 그렇지 않으면 LEFT OUTER 필요가있을 것이다는 가입 :

SELECT * FROM candy c 
    LEFT OUTER JOIN expensive_properties ep ON c.id = ep.id 
WHERE [your criteria] 

이 일치하는 것을 선택하고 EP에 대한 null을 떠나 * 존재하지 않습니다. 캔디 테이블.

2

보기에서 왼쪽 조인을 수행하려고합니다. 이렇게하면 조인의 첫 번째 테이블과 일치하는 두 번째 테이블의 모든 항목이 다시 나타납니다. 일치하지 않으면 (캔디가 비싸지 않다), 두 번째 테이블의 필드는 null이됩니다.

은 선택 * 사탕 왼쪽 바깥에서 나는 지금을 시도하기 위하여려고하고있다,

+0

+1 좋은 답변입니다! – Dave

관련 문제