2015-06-09 97 views
2

想象一下:SQL - 從多個表中選擇多個字段

table1的

ID Type Priority 
1212 A CRITICAL 
1213 B MAJOR 
1214 B MINOR 
1215 A MAJOR 
1216 A CRITICAL 
1217 A CRITICAL 

表2

ID   STATE  CHANGEDATE 
1212  Pending  03-06-2015 17:47 
1212  Closed  04-06-2015 05:47 
1212  InProgress 03-06-2015 15:32 
1212  Start  03-06-2015 15:07 
1212  Opened  03-06-2015 13:47 
  • table1中包含了所有的ID信息
  • 表2包含了所有不同的ID號信息

我需要什麼:我需要從兩個表中獲取所有ID的信息。

我爲什麼掙扎:除了我的n00b水平(讓我只說我不是Valhalla材料),我無法將第一張表和第二張表中的信息關聯起來。

我想象什麼:

ID Type Priority Opened    Closed 
1212 A CRITICAL 03-06-2015 13:47 - 
1215 A MAJOR  06-06-2015 18:00 07-06-2015 18:00 
1216 A CRITICAL 03-05-2015 13:10 04-06-2015 18:00 
1217 A CRITICAL 01-06-2015 11:03 05-06-2015 18:00 

UPDATE:

這是我嘗試過,但是專注於一個特定的ID(1212):

SELECT 
    MAX (ID_A) AS "ID", 
    MAX (STATE_A) AS "ACTION NAME", 
    MAX (CHANGEDATE_A) AS "START", 
    MAX (STATE_B) AS "ACTION NAME", 
    MAX (CHANGEDATE_B) AS "END" 
FROM (
SELECT 
    ID AS ID_A, 
    STATE AS STATE_A, 
    CHANGEDATE AS CHANGEDATE_A, 
    NULL AS ID_B, 
    NULL AS STATE_B, 
    NULL AS CHANGEDATE_B 
FROM table2 
WHERE table2.ID = '1212' AND table2.STATE = 'Start' 
UNION ALL 
SELECT 
    NULL AS ID_A, 
    NULL AS STATE_A, 
    NULL AS CHANGEDATE_A, 
    ID AS ID_B, 
    STATE AS STATE_B, 
    CHANGEDATE AS CHANGEDATE_B 
FROM table2 
WHERE table2.ID = '1212' AND table2.STATE = 'Close'); 

運行此我」會得到如下結果:

ID ACTION NAME START   ACTION NAME END 
1212 Start 03-06-2015 13:47 Close  - 

我需要的是同樣的,但是這次對於所有的ID,生成一個列表(沒有指定ID)。

+0

歡迎使用計算器。請閱讀[問]。提示#1:告訴我們你已經嘗試了什麼。提示#2:您需要將表2連接兩次到表1. –

+0

日期和時間遵循SQL中的特定格式/數據類型。這不是。修復,然後回到我們身邊。 – Strawberry

+0

我提出的日期格式僅僅是一個例子(這是我在SQL Developer中爲了更好的閱讀而配置它的方式)。 –

回答

0
select t1.ID, 
     t1.Type, 
     t1.Priority, 
     max(case when t2.State = 'Opened' then ChangeDate end) as Opened,  
     max(case when t2.State = 'Closed' then ChangeDate end) as Closed 
from table1 t1 join table2 t2 on t1.id = t2.id 
group by t1.ID, 
     t1.Type, 
     t1.Priority 
0

您需要在SQL中使用JOIN。這可以讓你關聯這些信息。

基本語法如下。

您在理想的解決方案中引用OPENED和CLOSED,但由於這不在您的任何一個基表中,我不知道如何計算。

select t1.ID, 
     t1.Type,  
     t1.Priority, 
     t2.CHANGEDATE 
FROM table1 t1 
INNER JOIN table2 t2 ON t1.id = t2.REQUESTID 
+0

嗨, OPENED和CLOSED是表2中的字段,我需要這些字段的時間戳。 –