如何限制这个LEFT返回的行数连为一体?(How do I limit the number of

2019-06-23 18:56发布

因此,我认为我已经看到了解决这一然而他们都是很复杂的查询。 我在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_GROUP这两个表,但只有1个返回行。

当我做了左连接我得到三个行返回beaucse是兴田的本质左连接

Answer 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


Answer 2:

你可以做这样的事情。

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 )

该分区中的数据table2通过assignment_group ,然后随意排列他们拉每一个任意行assignment_group 。 如果你关心返回哪一行(或者,如果你想返回行确定的),你可以添加一个ORDER BY子句来解析功能。



Answer 3:

我想你需要的是使用GROUP BYASSIGNMENT_GROUP场。

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



Answer 4:

在MySQL中,你可以只GROUP BY分配和完成。 甲骨文更为严格,并拒绝只是选择(在不确定的方式)的三排的哪些值进行选择。 这意味着所有返回的列必须是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

如果你这样做,我会认真怀疑你需要摆在首位的JOIN。

MySQL也可以在你想组值的列中的字符串连接的情况下GROUP_CONCAT帮助(人类常常喜欢这样),但与甲骨文是惊人的复杂 。

使用作为已经建议一个子查询的选项, 看看这里的一个例子。 它也可以让你的子查询中选择顶行之前排序。



Answer 5:

在Oracle中,如果你想要个结果,你可以使用ROWNUM语句获取查询例如第N个值:

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

这种单一的查询问题是,甲骨文不会返回以相同的顺序中的数据。 所以,你必须奥德之前使用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


Answer 6:

你可以使用子查询 - 选择顶部1



文章来源: How do I limit the number of rows returned by this LEFT JOIN to one?