2015-06-09 65 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中的字段,我需要这些字段的时间戳。 –