如何从select中选择查询案例

时间:2014-08-12 07:17:02

标签: sql oracle select

我有以下查询

SELECT DISTINCT v.id, 
                ( CASE 
                    WHEN date IS NULL THEN v.o_id 
                    ELSE (SELECT os 
                          FROM   (SELECT o_id1 os 
                                  FROM   tablet t2 
                                  WHERE  t2.vso_id = v.id 
                                  ORDER  BY date ASC) 
                          WHERE  rownum = 1) 
                  END ) AS p_o, 
                v.o_id  AS k_o 
FROM   tablev v 
       LEFT JOIN tablet t 
              ON v.id = t.v_id; 

这是我需要的: TableV具有不同的v.id值。我需要将该表与另一个表(tableT)连接,该表具有相同v.id的许多记录,然后是每个不同的v.id:

  1. 从V
  2. 中选择O_ID
  3. 如果tableT中v.id的记录不存在(date为null)则 从V中选择O_ID(与上面相同),否则从T中选择o_id1 最短日期
  4. 另外,aditional,如果可能的话,将o_id从1.和o_id / o_id1从2加入另一个表并写下人的名字? 我希望,而不是o_id,每个v.id将选定的o_id加入另一个表(tableO)并选择名称。

    所以,我需要结果中的这些列:V.id,p_o,k_o 但如果它看起来真的很棒:v.id,p_o.name,k_o.name

1 个答案:

答案 0 :(得分:1)

要回答您的第一个问题,假设t.vso_idt.v_id是相同的事情(否则我可能误解了您的问题),请尝试此查询(我使用其他DBMS,因此您可能需要调整对COALESCE的调用一点):

SELECT v.id, COALESCE(t.o_id1, v.o_id), v.o_id
FROM tableV v 
     LEFT JOIN (
         (SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) min_dates
         JOIN tableT t
         ON min_dates.vso_id = t.vso_id AND min_dates.min_date = t.date
     ) ON v.id = t.v_id;

以下是细分:

(SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) AS min_dates

为每个vso_id选择一个最小的日期。

 (SELECT vso_id, min(date) AS min_date FROM tableT GROUP BY vso_id) AS min_dates
 JOIN tableT t
 ON min_dates.vso_id = t.vso_id AND min_dates.min_date = t.date

每个vso_id选择一行,该行将对应于该vso_id具有的最小日期。 最后,我将tableV连接到该查询。 COALESCE(t.o_id1,v.o_id)如果不是NULL则返回t.o_id,否则返回v.o_id。您可以使用CASE,但我发现COALESCE更适合此特定用途。

要回答第二个问题,您可以使用以下名称加入表:

JOIN table_with_names twn1 ON twn1.id = COALESCE(t.o_id1, v.o_id)
JOIN table_with_names twn2 ON twn2.id = v.o_id

并投影twn1.name和twn2.name。