为不在列表中的项创建视图

时间:2012-01-31 20:29:47

标签: sql views

我有两张桌子。表1是包含equipment_idequipment_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'

等等。

Rookie在这里,并不确定如何正确加入这些表。不能让它工作,并希望得到任何帮助。

3 个答案:

答案 0 :(得分: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

如评论中提到的那样,检查日期的表格确实有帮助。

答案 1 :(得分:0)

以下似乎基于我使用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

答案 2 :(得分: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,但不知道我必须自己构建它。