создать представление для элементов, которых нет в списке - PullRequest
2 голосов
/ 01 февраля 2012

У меня есть две таблицы. Таблица 1 является основным списком оборудования с equipment_id и equipment_description. Итак, скажем, для этой таблицы у меня есть десять equipment_id. 1,2,3 .... 10 каждый с некоторым описанием.

Таблица 2 регистрирует, когда оборудование было осмотрено:

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, которое извлекает из таблицы 2 все разные даты проверки - не уверен, что мне это нужно, но все равно сделал.

Я хотел бы создать другое представление, которое показывает все оборудование, которое НЕ было проверено на каждую дату в v_dates. Так это будет показывать:

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

и т. Д.

Новичок здесь и просто не уверен, как правильно соединить эти столы. Не могу заставить его работать и буду признателен за любую помощь.

Ответы [ 3 ]

0 голосов
/ 01 февраля 2012

Следующее, похоже, работает на основе моих тестовых данных с использованием SQL SERVER 2005. Я использую CROSS JOIN с разными датами вместе с LEFT 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 голосов
/ 01 февраля 2012

Согласно моему комментарию к вопросу, вам действительно нужна таблица действительных дат проверки.Это делает 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);

Выхочу комбо, которые не существуют.Таким образом, предикат not существует.

Еще раз обратите внимание, что, вероятно, у вас будет таблица для всех уникальных ID_оборудования, но вы не знаете, что мне пришлось создать ее самостоятельно.

0 голосов
/ 01 февраля 2012

Не проверено, но я думаю, что это должно дать желаемый результат:

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

Как упомянуто в комментариях, действительно поможет таблица с датами осмотра.

...