Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为不在列表中的项目创建视图_Sql_Views - Fatal编程技术网

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

Sql 为不在列表中的项目创建视图,sql,views,Sql,Views,我有两张桌子。表1是具有设备标识和设备描述的设备主列表。那么,假设这个表有十个设备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' 我

我有两张桌子。表1是具有
设备标识
设备描述
的设备主列表。那么,假设这个表有十个
设备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_日期中每个日期未检查的所有设备。因此,它将表明:

3 | '1-22-2012'
5 | '1-22-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

如评论中所述,带有检查日期的表格确实有帮助。

未经测试,但我认为这应该会得到预期的结果:

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

如注释中所述,带有检查日期的表格确实有帮助。

根据我使用SQL SERVER 2005的测试数据,以下内容似乎有效。我使用了一个不同日期的交叉连接和一个左连接来抛出那些日期的设备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

根据我使用SQLServer2005的测试数据,以下内容似乎可以正常工作。我使用了一个不同日期的交叉连接和一个左连接来抛出那些日期的设备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

根据我对问题的评论,您确实需要一份有效检查日期表。它使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);
您想要的组合不存在。因此,谓词不存在


请再次注意,您可能会有一个用于所有唯一设备ID的表格,但不知道我必须自己构建它。

根据我对问题的评论,您确实需要一个有效检查日期的表格。它使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);
您想要的组合不存在。因此,谓词不存在


请再次注意,您可能会有一个用于所有唯一设备ID的表,但不知道我必须亲自构建该表。

您使用的是什么SQL server软件?在没有检查的情况下,是否要查看所有条目?如果是这样,那么使用一个列出所有可能检查日期的参考表就更容易了。这种性质的问题很难回答,因为你有两个关系,而且你在询问两组信息缺失时的结果@MikeRyan是对的-检查应该发生的日期参考表使问题更容易解决。您使用的是什么SQL server软件?在没有检查发生的一天,是否要查看所有条目?如果是这样,那么使用一个列出所有可能检查日期的参考表就更容易了。这种性质的问题很难回答,因为你有两个关系,而且你在询问两组信息缺失时的结果@MikeRyan是对的-一个检查应该发生的日期参考表使这更容易解决。DGW也感谢您的帮助。我来看看我得到了什么结果。不过,这并没有显示
设备id
。另外-
分组依据
顺序依据
顺序位置是不吉利和危险的。DGW也感谢您的帮助。我来看看我得到了什么结果。不过,这并没有显示
设备id
。另外-
分组依据
顺序依据
顺序位置是不吉利和危险的。谢谢迈克。检查应在一年中的每一天进行,但可能有几天不进行检查。我的报告显示了他们所做的检查,但我认为,显示哪些检查被遗漏可能会有所帮助。在mysql中尝试这个,但在我完成oracle之后将运行。谢谢Mike。检查应在一年中的每一天进行,但可能有几天不进行检查。我的报告显示了他们所做的检查,但我认为,显示哪些检查被遗漏可能会有所帮助。在mysql中尝试此功能,但将在我完成oracle后运行。