11

所以我想我已经看到了一个解决方案,但是它们都是非常复杂的查询。我在 oracle 11g 中供参考。

我所拥有的是一个简单的一对多连接,效果很好,但我不需要很多。我只希望左表(那个)只加入符合加入条件的任何 1 行......行不多。

我需要这样做,因为查询是在一个汇总中,所以如果我执行正常的左连接,我会得到 5 行,而我只应该得到 1。

所以示例数据如下:

TABLE 1:
-------------
TICKET_ID      ASSIGNMENT
5              team1
6              team2

TABLE 2:
-------------
MANAGER_NAME   ASSIGNMENT_GROUP  USER
joe            team1             sally
joe            team1             stephen
joe            team1             louis
harry          team2             ted
harry          team2             thelma

我需要做的是在 ASSIGNMENT=ASSIGNMENT_GROUP 上加入这两个表,但只返回 1 行。

当我进行左连接时,我会返回三行,这就是左连接的本质

4

6 回答 6

11

如果 oracle 支持行号(分区依据),您可以创建一个子查询,选择其中行等于 1。

SELECT * FROM table1
LEFT JOIN
(SELECT *
FROM   (SELECT *,
           ROW_NUMBER()
             OVER(PARTITION BY assignmentgroup ORDER BY assignmentgroup) AS Seq
    FROM  table2) a
WHERE  Seq = 1) v
ON assignmet = v.assignmentgroup
于 2012-04-19T20:45:38.107 回答
10

你可以做这样的事情。

SELECT t1.ticket_id, 
       t1.assignment,
       t2.manager_name,
       t2.user
  FROM table1 t1
       LEFT OUTER JOIN (SELECT manager_name,
                               assignment_group,
                               user,
                               row_number() over (partition by assignment_group
                                                    --order by <<something>>
                                                 ) rnk
                          FROM table2) t2
                     ON (    t1.assignment = t2.assignment_group
                         AND t2.rnk = 1 )

这将数据分区table2assignment_group然后任意排列它们以拉出任意一行assignment_group。如果您关心返回哪一行(或者如果您想使返回的行具有确定性),您可以ORDER BY在分析函数中添加一个子句。

于 2012-04-19T20:52:27.263 回答
2

我认为你需要的是GROUP BYASSIGNMENT_GROUP球场上使用。

http://www.w3schools.com/sql/sql_groupby.asp

于 2012-04-19T20:32:10.260 回答
1

在 Oracle 中,如果您想要 1 个结果,您可以使用该ROWNUM语句来获取查询的前 N ​​个值,例如:

SELECT *
FROM TABLEX
WHERE
ROWNUM = 1 --gets the first value of the result

这个单一查询的问题是 Oracle 永远不会以相同的顺序返回数据。因此,您必须在使用 rownum 之前对数据进行排序:

SELECT *
FROM
    (SELECT * FROM TABLEX ORDER BY COL1)
WHERE
ROWNUM = 1

对于您的情况,您似乎只需要 1 个结果,因此您的查询应如下所示:

SELECT *
FROM
    TABLE1 T1
    LEFT JOIN 
    (SELECT *
    FROM TABLE2 T2 WHERE T1.ASSIGNMENT = T2.ASSIGNMENT_GROUP
    AND
    ROWNUM = 1) T3 ON T1.ASSIGNMENT = T3.ASSIGNMENT_GROUP
于 2012-04-19T20:48:28.603 回答
1

在 MySQL 中,您只需 GROUP BY ASSIGNMENT 即可完成。Oracle 更加严格,拒绝只选择(以未定义的方式)选择三行的哪些值。这意味着所有返回的列都必须是 GROUP BY 的一部分或受一个聚合函数(COUNT、MIN、MAX ...)的约束

您当然可以选择不关心并在返回的列上使用一些聚合函数。

select TICKET_ID, ASSIGNMENT, MAX(MANAGER_NAME), MAX(USER)
from T1
left join T2 on T1.ASSIGNMENT=T2.ASSIGNMENT_GROUP
group by TICKET_ID, ASSIGNMENT

如果你这样做,我会严重怀疑你首先需要加入。

MySQL 也可以帮助 GROUP_CONCAT 在你想要一个列的组值的字符串连接的情况下(人类经常这样),但使用 Oracle 是非常复杂的。

使用已经建议的子查询是一种选择,请在此处查看示例。它还允许您在选择第一行之前对子查询进行排序。

于 2012-04-19T20:51:03.730 回答
-2

您可以使用子查询 - 选择前 1

于 2012-04-19T20:34:50.680 回答