2013-07-09 21 views
0

我有下面的查詢從哪裏獲取來自加入表日誌和設備的數據,但是從表設備中出來的b.id也在另一個名爲具有相同列名的設備2的表中。所以我必須寫一個查詢,其中如果設備表在該ID列上有空或空值,則必須用表日誌來提取加入表設備2的記錄,否則它必須加入表設備和日誌。如何從表X連接表Y或表Z中獲取特定記錄,其中表Y和Z具有相同的列名和相同種類的數據?

SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE, 
b.id, 
a.atid, 
a.l_type, 
a.l_subtype, 
a.eq, 
a.name, 
a.comments 
FROM log a, (equipment b or equipment2 b) 
WHERE a.eqid = b.eqid(+) 
AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY') 
         AND TO_DATE ('07/08/2070', 'MM/DD/YYYY') 
GROUP BY a.log_date, 
b.id, 
a.atid, 
a.l_type, 
a.l_subtype, 
a.eq, 
a.name, 
a.comments 
ORDER BY b.id; 
+0

這些表之間是否有任何引用定義?這句話聽起來很奇怪:'設備表有**空**或空值'。另外,爲什麼有兩個「設備」表?他們是否共享相同的結構? – Eggplant

+0

我們的數據庫中有兩種設備類型。假設當用戶提交他們的請求時,他們可以選擇類型1設備或類型2.兩種類型的設備數據都來自單個表eqdata,其中id(主鍵)相同,但設備類型不同。所以我們根據設備類型存儲數據。如果它的設備類型爲1,則它將轉到設備1表,否則如果其設備類型爲2,則轉到設備2表。 – user2528510

+0

這些類型的問題通過使用ANSI-92語法變得非常容易避免或解決。 – Wolf

回答

1

假設子記錄將永遠是在任何設備或設備2,但從來沒有兩個,你只需要添加設備2與外連接,並使用NVL()來挑不爲空值:

SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE, 
    nvl(b.id,b2.id), 
    a.atid, 
    a.l_type, 
    a.l_subtype, 
    a.eq, 
    a.name, 
    a.comments 
FROM 
    log a, 
    equipment b, 
    equipment2 b2 
WHERE 
    a.eqid = b.eqid(+) 
    AND a.eqid = b2.eqid(+) 
    AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY') 
        AND TO_DATE ('07/08/2070', 'MM/DD/YYYY') 
ORDER BY 2 

這也假定你只選擇一個不會填充NULL的列。如果,例如,設備/設備2還包含一個「名稱」列可能爲空,你需要一些額外的邏輯:

case when b.id is null then b2.name else b.name end 
0

另一種可能性是合併這兩個設備表和剛剛加入這一點。假設表格結構在設備和設備2中是相同的,否則你會想選擇你的特定領域當然。否則...

SELECT * 
INTO #equipTemp 
FROM equipment WHERE ID IS NOT NULL 
UNION ALL 
SELECT * FROM equipment2 WHERE ID IS NOT NULL 

SELECT TO_CHAR (a.LOG_DATE, 'mm/dd/yyyy HH:MI:SS') LOG_DATE, 
b.id, 
a.atid, 
a.l_type, 
a.l_subtype, 
a.eq, 
a.name, 
a.comments 
FROM log a, #eqipTemp b 
WHERE a.eqid = b.eqid(+) 
AND log_date BETWEEN TO_DATE ('07/01/2013', 'MM/DD/YYYY') 
        AND TO_DATE ('07/08/2070', 'MM/DD/YYYY') 
GROPU BY... 
+0

這就是SQL Server語法... – Joe

相關問題