Oracle SQL Query加入四个表只能获得一行多个条目

时间:2015-05-23 13:00:45

标签: sql database oracle join

我的表格设置如下:

Table 1            Table 2                            Table 3        
+-------+-----+    +-------+-------+-------+-----+    +-------+-----+
| ID    | ... |    | ID    | T1_ID | T3_ID | ... |    | ID    | ... |
+-------+-----+    +-------+-------|-------|-----|    |-------|-----|
|  101  | ... |    |  202  |  101  |  301  | ... |    |  300  | ... |
|  102  | ... |    |  203  |  101  |  302  | ... |    |  302  | ... |
|  104  | ... |    |  204  |  101  |  302  | ... |    |  314  | ... |
+-------+-----+    |  205  |  101  |  302  | ... |    +-------+-----+
                   |  206  |  104  |  327  | ... |                   
                   +-------+-------+-------+-----+                   

如果table2.t3_id存在于表3中,我想构造一个子查询语句,该语句将为表1的给定id选择表2中只有一行

重要的一点是,表2中可能存在多个具有相同t3_id的行。因此,表2和表之间的外键关系不是唯一的或根本不存在。

我的想法是以下声明:

inner join 
(
    SELECT * 
    FROM (
        SELECT t3_id, t1_id, id 
        FROM table2 
        WHERE EXISTS 
        (
            SELECT id 
            FROM table3
        )
    ) 
    WHERE ROWNUM=1
) tb2 ON tb1.id = tb2.t1_id

此语句返回多行,但我只需要一行。 我该怎么做?

2 个答案:

答案 0 :(得分:2)

未经测试但应该做你需要的事情

SELECT *
FROM table1 t1 JOIN table2 t2 
ON ( t1.id = t2.t1_id
     AND EXISTS ( SELECT 'x'
                  FROM table3 t3
                  WHERE t2.t3_id = t3.id
                 )
     AND NOT EXISTS ( SELECT 'a'
                      FROM table2 t22 
                      WHERE t22.t1_id = t2.t1_id
                      AND t22.id < t2.id
                     )
   )

答案 1 :(得分:0)

您可以使用row_number()枚举它们,然后只选择一个值,从而获得一行多个条目。这是一个例子:

select . . .
from table1 t1 join
     (select t2.*, row_number() over (partition by t.id order by t2.id) as seqnum
      from table2 t2
     ) t2
     on t2.t1_id = t1.id and t2.seqnum = 1;

编辑:

对于所有三个表,您希望执行row_number()所有连接:

select . . .
from (select . . ., row_number() over (partition by t1_id order by id) as seqnum
      from table1 t1 join
           table2 t2
           on t2.t1_id = t1.id join
           table3 t3
           on t2.t3_id = t3.id
     ) t
where seqnum = 1;
相关问题