Sql 如何将此左联接返回的行数限制为一行?

Sql 如何将此左联接返回的行数限制为一行?,sql,oracle,join,limit,Sql,Oracle,Join,Limit,所以我想我已经看到了一个解决方案,但是它们都是非常复杂的查询。我在Oracle11g中作为参考 我所拥有的是一个简单的一对多连接,它非常有效,但是我不需要太多。我只希望左边的表只连接满足连接条件的任何一行…不是很多行 我需要这样做,因为查询是在一个统计的汇总中,所以如果我进行正常的左连接,我会得到5行,其中我应该只得到1行 因此,示例数据如下所示: TABLE 1: ------------- TICKET_ID ASSIGNMENT 5 team1 6

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

我所拥有的是一个简单的一对多连接,它非常有效,但是我不需要太多。我只希望左边的表只连接满足连接条件的任何一行…不是很多行

我需要这样做,因为查询是在一个统计的汇总中,所以如果我进行正常的左连接,我会得到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\u组上连接这两个表,但只返回一行


当我进行左连接时,返回三行,这就是左连接的性质,我想你需要的是在分配组字段中使用GROUP BY


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

如果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

在Oracle中,如果需要1个结果,可以使用该语句获取查询的前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
对于您的情况,看起来您只需要一个结果,因此您的查询应该如下所示:

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

在MySQL中,您只需按任务分组即可。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就是这样


例如,使用已经建议的子查询是一个选项。它还允许您在选择顶行之前对子查询进行排序。

您可以这样做

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 )

这会将表2中的数据按赋值组进行分区,然后对它们进行任意排序,以便为每个赋值组提取任意一行。如果您关心返回哪一行,或者希望使返回的行具有确定性,则可以在分析函数中添加ORDER BY子句。

我认为这不会得到我想要的结果,因为我还需要其他字段中的其他信息。我必须做一些奇怪的事情,比如连接它们。你能基于上面的查询发布一个示例SQL语句吗。我知道您可以执行子查询,只是不确定语法。这是否也会将我限制为表1中的1行?我只需要联接表2中的一行,但表1中的所有行都需要。不能像在内联视图中那样引用T1.ASSIGNMENT,因为T1是在更高级别的查询中定义的。您可以添加一个分析函数,该函数按T2.ASSIGNMENT_组进行划分,然后将秩包含在联接条件中。下面是一个示例。或者,您也可以将针对T2的查询移动到选择列表中的标量子查询中,尽管这样可能效率要低得多。然后使用限制1。没什么大不了的。甲骨文也不支持限制条款。虽然有很多答案,但如果你不解释为什么你只想要一行,你就不可能知道你需要什么。您真的希望每个任务组有一个随机用户吗?为什么?你能在订单上加上或者注释掉吗clause@RuneJeppesen-添加了order by的示例。这个问题是关于Oracle的,因此您可以在不同的数据库中执行的所有操作都无关紧要