2017-10-05 3 views
1

이전 검색의 결과가있는 테이블에서 데이터를 추출하려고합니다. 나는 데이터베이스 쿼리에 익숙하지 않고 내 컴퓨터가 너무 많은 메모리를 사용하지 못하게 만들 것이다.다른 검색 결과가있는 테이블에서 데이터 추출

이 데이터는 보드 테스터에서 가져오고 있으며 특정 정보가 필요합니다. 그 보드에 대한 편집을

  • 모든 고장 데이터를 실패 얼마나 많은 주어진 기간
  • 동안 실행 얼마나 많은 보드

    1. : 이것은 내가 알아 내야 하나입니다. 하단의 편집을 참조하십시오.

    보드가 그것을 실행되어 처음으로 이사회 테이블에 레코드를 작성

    보드가 그것을 실행 때마다이 테스트 기록

    +----------+----------+---------+---------------------+ 
    | Test_id | Board_id | Operator| Date_Time   | 
    +----------+----------+---------+---------------------+ 
    |  34 | 1  | 1  | 2017-08-02 09:13:34 | 
    |  35 | 1  | 1  | 2017-08-02 09:13:36 | 
    |  36 | 1  | 1  | 2017-08-02 09:13:39 | 
    |  37 | 2  | 1  | 2017-08-02 09:14:10 | 
    |  38 | 3  | 1  | 2017-08-02 09:16:24 | 
    |  39 | 3  | 2  | 2017-08-03 10:40:45 | 
    |  40 | 4  | 2  | 2017-08-03 10:43:34 | 
    +----------+----------+---------+---------------------+ 
    

    를 생성

    +----------+-------+-----+ 
    | Board_id | Board | rev | 
    +----------+-------+-----+ 
    |  1 | 1234 | 1 | 
    |  2 | 1234 | 1 | 
    |  3 | 1235 | 2 | 
    |  4 | 5869 | 15 | 
    +----------+-------+-----+ 
    
    ... 그리고 결과는 결과에 저장됩니다.

    +-----------+---------+--------+-------------+-------------+ 
    | Result_id | Test_id | Result | Upper_Limit | Lower_Limit | 
    +-----------+---------+----------------------+-------------+ 
    |  40 | 34  | 2  | 4   | 1   | 
    |  41 | 34  | 3  | 4   | 1   | 
    |  42 | 34  | 4  | 4   | 1   | 
    |  43 | 34  | 0  | 4   | 1   | 
    |  44 | 35  | 2  | 4   | 1   | 
    |  45 | 35  | 3  | 4   | 1   | 
    |  46 | 35  | 4  | 4   | 1   | 
    |  47 | 35  | 0  | 4   | 1   | 
    |  48 | 36  | 2  | 4   | 1   | 
    |  49 | 36  | 3  | 4   | 1   | 
    |  50 | 36  | 4  | 4   | 1   | 
    |  51 | 36  | 2  | 4   | 1   | 
    |  52 | 37  | 2  | 4   | 1   | 
    |  53 | 37  | 3  | 4   | 1   | 
    |  54 | 37  | 4  | 4   | 1   | 
    |  55 | 37  | 2  | 4   | 1   | 
    |  56 | 38  | 2  | 4   | 1   | 
    |  57 | 38  | 3  | 4   | 1   | 
    |  58 | 38  | 4  | 4   | 1   | 
    |  59 | 38  | 5  | 4   | 1   | 
    |  60 | 39  | 2  | 4   | 1   | 
    |  61 | 39  | 3  | 4   | 1   | 
    |  62 | 39  | 4  | 4   | 1   | 
    |  63 | 39  | 5  | 4   | 1   | 
    |  64 | 40  | 2  | 4   | 1   | 
    |  65 | 40  | 3  | 4   | 1   | 
    |  66 | 40  | 4  | 4   | 1   | 
    |  67 | 40  | 3  | 4   | 1   | 
    +-----------+---------+--------+-------------+-------------+ 
    

    게시판 및 Board_ID가 특정 기간 동안 실행되었습니다.

    SELECT a.Board_ID FROM  
        Tests a, Results b 
    WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and 
        a.Test_ID = b.Test_ID 
        group by a.Board_ID 
    

    해당 Board_ID의 I 쿼리에 관련된 모든 테스트를 수행하려면.

    SELECT * from 
        Tests x, (
        SELECT a.Board_ID FROM  
         Tests a, Results b 
        WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and 
         a.Test_ID = b.Test_ID 
         group by a.Board_ID 
        ) y 
    where x.Board_ID = y.Board_ID 
    

    이 나에게 정확한 결과를 제공하지만, 쿼리가 떨어져 보인다,하지만 난 쿼리에서 실패한 결과를 얻을 수하려고 할 때 위의 내가 가장 문제가있을 때입니다.

    SELECT d.Test_ID FROM 
        Boards a, Tests b, (
        SELECT x.Test_ID, x.Board_ID, x.Operator, x.Date_Time from 
         Tests x, (
         SELECT a.Board_ID FROM  
          Tests a, Results b 
         WHERE a.Date_Time>='2017-08-02' AND a.Date_Time<'2017-08-03' and 
           a.Test_ID = b.Test_ID 
           group by a.Board_ID 
         ) y 
        )d 
    WHERE d.Test_ID = b.Test_ID and 
        b.Result not between Lower_Limit and Upper_Limit 
    

    편집 : 당신은 내가 당신이 board_id 3 번과 두 개의 서로 다른 일 테스트있어 볼 만든 테스트 테이블을 보면

    . 우리는 주어진 날에 실행 한 게시판,이 예제 2017-08-02 및 해당 게시판에 대한 모든 관련 기록을 볼 필요가 있습니다. 그래서 Board_ID # 3이 2 일에 실행되어 문제가 된 날에 실행되었으므로 필자의 쿼리에 해당 레코드가 필요합니다.

    내 솔루션은 내가 내가 원하는 정보를 분석하는 데 필요한 모든 데이터를 얻을 수 3 개 개별 검색 1.에 3 개 중첩 된 검색 결과가 볼이에서

    SELECT * FROM 
    (
        SELECT x.Test_ID, x.Board_ID, x.Operator, x.Date_Time from 
         Test x, (
          SELECT a.Board_ID FROM  
           Test a 
           join Results b on a.Test_ID = b.Test_ID 
          WHERE a.Date_Time>='2017-08-11' AND a.Date_Time<'2017-08-12' 
           group by a.Board_ID 
         ) y 
        where x.Board_ID = y.Board_ID 
    )d 
        join Boards a on a.Board_ID = d.Board_ID 
        join Results b on b.Test_ID = d.Test_ID 
        join Test_Names c on c.Test_Name_ID = b.Test_Name_ID --Table Not shown 
    WHERE 
        b.result not between Lower_Limit and Upper_Limit 
    

    . 다음으로는 구문 분석 대신 필요한 데이터베이스를 쿼리하는 방법을 찾는 것입니다.

  • +0

    마지막 쿼리를 올바르게 붙여 넣었는지 확인하십시오. 그것은 갑자기 "and"로 끝나고 "d.Test_ID = d.Test_ID"도 보게됩니다. 항상 당신이 맞을 것입니다. –

    +1

    또한 'INNER JOIN'과'LEFT OUTER JOIN'을 사용해야합니다. 쉼표 분리 표는 20-30 년 전에 인기가 있었고 어느 ​​시점에서 작업을 중단합니다. (잘하면) – CptMisery

    +0

    실제로 아무것도 계산하지 않습니다. 그렇다면 총계는 왜? 그리고 하위 쿼리가 필요한 이유는 무엇입니까? – Parfait

    답변

    2

    나는 당신이 이것을 과소 평가하고 있다고 생각합니다. 모든 인라인보기가 필요하지 않습니다. 여기에 내가

    SELECT d.test_id, b.board, b.board_rev, r.result_id, r.result -- and whatever else you need. 
    from tests t 
    join results r on t.test_id = r.test_id 
    join boards b on t.board_id = b.board_id 
    where t.Date_Time>='2017-08-02' AND t.Date_Time<'2017-08-03' 
    and r.result >Lower_Limit -- or >= 
    and r.result < Upper_Limit -- or <=, if it can be the limit value 
    

    이 관계 (기본 키 외래 키)를 기반으로 모든 테이블을 조인 (@CptMisery는 의견 제안 등) ANSI는, where 절에서 필터를 선택 조인 사용하여 작성하고 할 방법 선택을 사용하여 "프로젝트"할 열을 선택하십시오.

    +0

    케빈,이게 거의 ​​내가 뭘 찾았는지. 내가 작성한 Test 테이블을 보면 board_id 3이 두 번 테스트되었고 다른 두 일에 테스트 된 것을 볼 수 있습니다. 우리는 주어진 날에 우리가 실행 한 게시판과 해당 게시판의 모든 관련 기록을 볼 필요가 있습니다. 아이디어? – Bluto

    +0

    "모든 관련 테스트"세부 사항을 놓쳤습니다. 질의는 내 답변과 원래 시도의 혼합이 될 것입니다. 나는 나중에 편집하려고 노력할 것이다. –

    +0

    조인과 중첩 된 검색을 결합하여 원하는 데이터를 얻습니다. – Bluto

    0
    SELECT d.Test_ID FROM 
        Boards a, Tests b, (SELECT x.Test_ID, 
               x.Board_ID, 
               x.Operator, 
               x.Date_Time 
              from Tests x, 
               (SELECT a.Board_ID 
                FROM Tests a, Results b 
                WHERE a.Date_Time>='2017-08-02' 
                AND a.Date_Time<'2017-08-03' 
                and a.Test_ID = b.Test_ID 
               group by a.Board_ID 
                ) y 
             )d 
        WHERE d.Test_ID = d.Test_ID 
        and b.Result >= Lower_Limit 
        and b. Result <=Upper_Limit 
    
    +0

    두 열의 데이터 유형이 같고 d.Test_ID = d.Test_ID를 d.Test_ID = b로 바꾸면됩니다. Test_ID 올바른 코드는 SELECT d.Test_ID FROM Boards, Tests b, (SELECT x.Test_ID, x.Board_ID, x.Operator, x.Date_Time from Tests x, SELECT a.Board_ID FROM 테스트 a, 결과 b where a.Date_Time> = '2017-08-02'AND a.Date_Time < '2017-08-03'및 a.Test_ID = b.Test_ID 그룹 by aBoard_ID) y) d WHERE b.Test_ID = d.Test_ID b> 결과> = Lower_Limit 및 b. 결과 <= Upper_Limit –

    관련 문제