2012-01-31 2 views
2

두 개의 표가 있습니다. 표 1은 equipment_idequipment_description 인 장비의 마스터 목록입니다. 자,이 테이블에 대해 제가 열 개의 equipment_id을 가지고 있다고 가정 해 봅시다. 1,2,3 .... 10 각각에 몇 가지 설명이 첨부되어 있습니다. 장비가 검사 된목록에없는 항목에 대한보기 만들기

표 2 로그 : 나는 테이블이 별개의 검사 날짜의 모든 밖으로 끌어보기, v_dates 만든

equipment_id|inspection_date 
     1 | '1-22-2012' 
     2 | '1-22-2012' 
     4 | '1-22-2012' 
     2 | '1-23-2012' 
     3 | '1-23-2012' 

- 나는 그것을 필요로하지만 한 경우에 확실하지를 어쨌든.

v_dates의 각 날짜에 대해 검사되지 않은 모든 장비를 보여주는 다른보기를 만들고 싶습니다. 그러면 다음과 같이 표시됩니다.

3 | '1-22-2012' 
5 | '1-22-2012' 

등등.

루키 여기에 정확하게이 테이블을 조인하는 방법을 모르겠다. 그것이 작동하도록 할 수없고 어떤 도움을 주셔서 감사합니다.

+0

어떤 SQL Server 소프트웨어를 사용하고 있습니까? – Graham

+3

검사가없는 날에는 모든 항목을보고 싶습니까? 그렇다면 모든 가능한 검사 일을 열거하는 참조 표를 사용하면 더 쉬울 것입니다. –

+1

당신은 두 가지 관계가 있기 때문에 이런 성질의 질문은 어색합니다. 그리고 당신은 * 양쪽 세트에 정보가 누락 된 경우의 결과를 요구하는 것과 같습니다. @MikeRyan이 옳다. 검사를 실시해야하는 날짜의 참조 표를 사용하면 훨씬 쉽게 해결할 수있다. – Yuck

답변

0

테스트되지 않은,하지만 난이 원하는 결과를 제공한다고 생각 : 검사와 테이블이 정말 도움이 종료일의 것 코멘트에 언급

SELECT i.id,d.date FROM 
    (SELECT DISTINCT inspection_date AS date FROM inspections ORDER BY 1) d 
    LEFT JOIN 
    inspections i 
    ON d.date=i.date 
WHERE i.date IS NULL 
GROUP BY 1,2 
ORDER BY 1,2 

같이합니다.

+0

DGW 도움을 주셔서 감사합니다. 내가 얻은 결과를 볼 수 있습니다. – Scott

+0

이것은 'equipment_id'를 표시하지 않습니다.또한 'GROUP BY'와 'ORDER BY'서수 위치는 지저분하고 위험합니다. – Yuck

0

다음은 SQL SERVER 2005를 사용하여 테스트 데이터를 기반으로 작동하는 것으로 보입니다. LEFT JOIN과 함께 다른 날짜의 CROSS JOIN을 사용하여 해당 날짜에 존재하는 EQUIPMENT_ID 레코드를 제거합니다.

미안 해요, 난 데 문제가 내 코드 탭과 공백 올바른 서식을 받고 ... 질문에 대한 내 의견으로 당

IF OBJECT_ID('tempdb..#EQUIPMENT') IS NOT NULL 
    DROP TABLE #EQUIPMENT 

CREATE TABLE #EQUIPMENT 
    ( EQUIPMENT_ID  smallint, 
     EQUIPMENT_DESC varchar(32) 
    ) 

INSERT INTO #EQUIPMENT 
    ( EQUIPMENT_ID, EQUIPMENT_DESC ) 
      SELECT 1, 'AAA' 
UNION SELECT 2, 'BBB' 
UNION SELECT 3, 'CCC' 
UNION SELECT 4, 'DDD' 
UNION SELECT 5, 'EEE' 
UNION SELECT 6, 'FFF' 
UNION SELECT 7, 'GGG' 
UNION SELECT 8, 'HHH' 
UNION SELECT 9, 'III' 
UNION SELECT 10, 'JJJ' 

IF OBJECT_ID('tempdb..#INSPECTION') IS NOT NULL 
    DROP TABLE #INSPECTION 

CREATE TABLE #INSPECTION 
    ( EQUIPMENT_ID  smallint, 
     INSPECTION_DATE smalldatetime 
    ) 

INSERT INTO #INSPECTION 
    ( EQUIPMENT_ID, INSPECTION_DATE ) 
      SELECT 1, '1-22-2012' 
UNION SELECT 1, '1-27-2012' 
UNION SELECT 3, '1-27-2012' 
UNION SELECT 5, '1-29-2012' 
UNION SELECT 7, '1-22-2012' 
UNION SELECT 7, '1-27-2012' 
UNION SELECT 7, '1-29-2012' 

SELECT E.EQUIPMENT_ID, D.INSPECTION_DATE 
FROM  #EQUIPMENT   E 
CROSS JOIN ( SELECT DISTINCT INSPECTION_DATE 
          FROM  #INSPECTION 
         ) D 
LEFT JOIN #INSPECTION  I2 
    ON  E.EQUIPMENT_ID = I2.EQUIPMENT_ID 
    AND  D.INSPECTION_DATE = I2.INSPECTION_DATE 
WHERE I2.EQUIPMENT_ID IS NULL 
ORDER BY E.EQUIPMENT_ID, D.INSPECTION_DATE 
+0

도움을 주신 John 께 감사드립니다. – Scott

0

, 당신은 정말 유효한 검사 날짜의 테이블이 필요합니다. 그것은 SQL을 훨씬 더 합리적으로 만들뿐만 아니라, 검사가 수행되어야 할 날짜에 대해 나열된 모든 항목을보고 싶지만 검사가 수행되지 않았 으면이를 수행하는 유일한 방법입니다.

그래서, 두 테이블 가정 : 다음

create table inspections (equipment_id int, inspection_date date); 

create table inspection_dates (id int, inspection_date date); 

을 장소가 될 것이다 검사가 수행해야 날짜에 검사를하지 않는 모든 장비를 얻기 위해 가입 :

select i.equipment_id, id.inspection_date 
from inspection_dates id, 
    (select distinct equipment_id from inspections) i 
where not exists (select * from inspections i2 
         where i2.inspection_date = id.inspection_date 
          and i2.equipment_id = i.equipment_id); 

존재하지 않는 콤보를 원합니다. 따라서 존재하지 않는 술어.

다시 말하지만, 고유 한 equipment_ids에 대한 모든 테이블을 가지고 있지만 직접 구성해야한다는 것을 알지 못했을 것입니다.

+0

감사합니다. 마이크. 검열은 일년 중 매일해야하지만 수행되지 않는 날이있을 수 있습니다. 내 보고서는 그들이 한 검사를 보여주고 있었지만 어떤 검사가 누락되었는지를 보여주는 것이 도움이 될 것이라고 생각했습니다. MySQL에서이 작업을 시도하지만 oracle 작업이 완료되면 실행 중입니다. – Scott

관련 문제