2013-11-22 2 views
0

(나는 생각한다)에 가입하세요. 나는 3 개의 테이블을 가지고 있지만 그것들에 합류 할 수는 있지만 옳은 답을 얻을 수 없다. 누군가가 나를 도울 수 있다면 나는 그것을 감사 할 것이다. 그래서 내가 원하는 것은 사용하지 않은 재료를 보여 주려는 답입니다. 테이블 :이 모든 사용되지 않은 자료를 가지고 많은 도움으로 enter image description hereMySQL의 왼쪽 내가 문제에있어

:

업데이트]
SELECT DISTINCT(Materials.Material_Name) AS Unused_materials FROM Materials 
LEFT JOIN Table2 ON Table2.Material_Number = Materials.Material_Number 
LEFT JOIN Table1 ON Table1.Procedure_Name = Table2.Procedure_Name 
WHERE Table1.Procedure_Name IS NULL 

: 나도 같은 게시물에 한 번 더 질문을 않을 수 있습니다. 어쩌면 누구든지 위 정보를 얻는 방법을 알았을 것입니다. 좋아요 : 2012-11-20의 미사용 자재? 당신이 그것을 만 사용되는 재료 당신에게 행을 줄 것이다 가지고 표 1 및 표 2에 가입

+2

선택 null가 – Hogan

답변

0

요한은 위의 거의를 (표 2는이 1 인 경우 Material_Number (에 PROCEDURE_NAME 단지 조회이기 때문에 사용되지 않는 물질이 여전히 table_2에 존재하는 것 같습니다. 일 관계가 바보 또한처럼 보인다) 여전히 필요 . 반복 비교를 위해 모든 명령을 null 값을 얻기 위해 표에 가입

그래서

SELECT * 
    FROM Materials c 
     LEFT JOIN Table2 b ON b.Material_Number = c.Material_Number 
     LEFT JOIN Table1 a ON a.Procedure_Name = b.Procedure_Name 
    WHERE a.Procedure_Name is null; 

:

create table Table1 (Procedure_Name char, date date); 
create table Table2 (Procedure_Name char, Material_Number int); 
create table Materials (Material_Name varchar(12), Material_Number int); 

insert into Table1 values ('A', '2012-11-22'); 
insert into Table1 values ('B', '2012-11-21'); 
insert into Table1 values ('C', '2012-11-20'); 

insert into Table2 values ('A', '101'); 
insert into Table2 values ('B', '102'); 
insert into Table2 values ('C', '103'); 
insert into Table2 values ('D', '104'); 
insert into Table2 values ('E', '105'); 

insert into Materials values ('Iron', 101); 
insert into Materials values ('Steel', 102); 
insert into Materials values ('Wood', 103); 
insert into Materials values ('Glass', 104); 
insert into Materials values ('Sand', 105); 

-- johan query 
SELECT Material_Name 
FROM Materials M 
LEFT JOIN Table2 T ON M.Material_Number = T.Material_Number 
WHERE Procedure_Name IS NULL; 

-- my query 
select Material_Name 
    from Materials c 
    left join Table2 b on b.Material_Number = c.Material_Number 
    left join Table1 a on a.Procedure_Name = b.Procedure_name 
where a.Procedure_Name is null; 
쿼리 최적화 프로그램이 잠재적으로, MySQL은하지 않습니다 조인 LEFT를 사용하는 경우 똑같이 효율적 무언가로이 차례 수 있지만
+0

이 쿼리는 약간 불편한 조인을하게 만듭니다. 나는 성능이 문제가되지 않는다고 생각한다! NOT IN 연산자는 사용자가 묻는 질문에 정확하게 답하도록 설계되었습니다! –

+0

나는 "거의 바르게"가지고 있다고 주장하기 전에 내 질문을해볼 것을 권한다. 하나의 왼쪽 가입만으로 충분합니다. 두 번째 가입은 완전히 불필요합니다. 하지만 분명히 a.Procedue_Name을 b.Procedure_Name으로 변경하거나 테이블 한정자를 제거해야합니다. –

+0

도움을 주셔서 감사합니다, 왼쪽 조인이 도움이 되셨습니다. :)하지만 감사합니다. 시간을내어 도움을 주신 모든 분들께 ^^ – user2965118

3

. 당신이하고 싶은 것은 사용되지 않은 모든 재료를 선택하는 것입니다. 이렇게하려면 단순히 NOT IN은 하위 쿼리 구성 사용

SELECT Material_Name AS Unused_materials 
FROM Materials 
WHERE Materials.Material_Number 
    NOT IN (SELECT Material_Number FROM Table2) 

업데이트 : 지금은 데이터 모델을 이해 (표 1에 나열된 절차에 사용되지 만 원하는 재료)

SELECT Material_Name AS Unused_materials 
FROM Materials 
WHERE Materials.Material_Number 
    NOT IN (SELECT Material_Number FROM Table2 
      INNER JOIN Table1 
       ON Table1.Procedure_Name = Table2.Procedure_Name) 
+0

널 선택합니다. 당신의 질의와 광산 모두에 대해 설명을하면 차이점을 알 수 있습니다. 그러면 기본 쿼리에서 찾은 모든 행에 대해 하나의 하위 쿼리가 실행됩니다. Gernal advive : 멀리 (NOT) 존재 (NOT) johanmårtensson @ –

+0

IN에서 유지 - 나는 다른 데이터베이스 기술에 과거의 경험에 의존하고 같이 그 날을 놀라게 할 것입니다. 나는 이것을 더 체크해야 할 것이다! –

+0

@ johanmårtensson -이 기사는 다음 검색어에 대한 좋은 분석 인 것으로 보입니다 : http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/나는 인덱스가 올바로 설정된 테이블을 가정하는 것보다 NOT IN이 (더 좋지는 않지만) 동등한 성능을 보일 것이라고 생각합니다. NOT IN에서 벗어나지 말라는 조언은 근거없는 것으로 보이지만, 링크 된 기사는 NOT EXISTS에 대해 경고합니다! 나는 다음에 mysql 프로젝트를 가지고있을 때 이것을 염두에 두어야 할 것이다. –

2

편집 : 무시이 솔루션을, 여기에서 쿼리에 대한 구성 NOT 사용하는 경우 사용할 올바른 쿼리입니다. 나는 완전한 토론을하기 위해 그것을 떠날거야. 아니면이 답을 없애는 것이 관례일까요?

데이비드 Fleeman의 솔루션에서 코멘트 - 토론 후, 나는 몇 가지 프로파일을했고 짧은 대답입니다 : NOT IN을 사용하여, 데이비드 Fleemans 솔루션과 함께 할 것입니다. 왼쪽 조인 솔루션보다 빠릅니다.

데이비드 Fleemans 솔루션을 사용하십니까

원래 포스트 해당 쿼리를 사용하여 빈 결과 집합하지만 아무것도 얻을하지 않습니다 이유는 당신이 material_name가 null되도록 지정도 material_name을 선택하고한다는 것이다 ...

모든 중고 재료는 표 2의 항목을 갖습니다. 사용하지 않은 모든 자료에는 이러한 항목이 없습니다. 따라서 재료에서 선택하고 Table2와 결합한 다음 프로 시저 이름이 null이라는 조건을 추가하십시오.

SELECT Material_Name 
FROM Materials M 
LEFT JOIN Table2 T ON M.Material_Number = T.Material_Number 
WHERE Procedure_Name IS NULL