2012-01-31 70 views
2

我有兩個表。表1是具有equipment_idequipment_description的設備的主清單。所以,假設這張桌子上有10個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' 

等等。

菜鳥在這裏,只是不知道如何正確地加入這些表。不能得到它的工作,並會感謝任何幫助。

+0

你在使用什麼SQL服務器軟件? – Graham 2012-01-31 20:31:34

+3

在沒有檢查的一天,你想看到所有的條目?如果是這樣,那麼使用列出所有可能的檢查日期的參考表格會更容易。 – 2012-01-31 20:35:37

+1

這種性質的問題很尷尬,因爲你有兩個關係,並且你有時要求*兩個*集缺少信息的結果。 @MikeRyan是正確的 - 檢查應該發生的日期參考表使得這更容易解決。 – Yuck 2012-01-31 20:36:53

回答

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 2012-02-01 16:40:03

+0

雖然沒有顯示'equipment_id'。另外 - 「GROUP BY」和「ORDER BY」順序位置很不安全並且很危險。 – Yuck 2012-02-01 17:37:12

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 
+0

感謝John的幫助。 – Scott 2012-02-01 16:39:35

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 2012-02-01 16:44:57