【问题标题】:Join of two tables where result displays on min() field of table 2连接两个表,结果显示在表 2 的 min() 字段中
【发布时间】:2016-11-03 14:10:48
【问题描述】:

使用 sql 过程,遇到一个找不到解决方案的问题。

表 A 包含字段 a、b、c。 还有一个包含字段 a、w、x、y、z 的表 B。

在这里,我想要两个表的连接结果,其中 A.a = B.a 并在输出中选择 c、x、y、z 等字段,其中 w 是最小值。 w 是一个整数。 以下代码有帮助,但是当我想显示表 2 中的更多字段时,出现错误提示未包含 Group by 子句。

SELECT OutO.routingSequence, 
       tbl2.a AS parentOrderNumber, 
       tbl2.c AS operationNumber,
       tbl2.d as headerStatus,
       tbl2.e as orderNumber
FROM Operation OutO
JOIN (
    SELECT a, MIN(c) c 
    FROM (
        SELECT h.parentordernumber a, o.operationNumber c 
        FROM header h , operation o 
        WHERE o.ordernumber=h.Parentordernumber
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) < 3
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) > -5
    ) tbl 
    GROUP BY a
) tbl2 
ON OutO.ordernumber = tbl2.a
WHERE OutO.operationnumber = tbl2.c

请帮忙!!!

【问题讨论】:

  • 我尝试重新格式化您的 SQL 以使其更具可读性,但对我来说仍然没有多大意义。它看起来不像是有效的 SQL
  • stackoverflow 的新手,不能真正格式化代码。我希望以下一个对您有用,此代码正在运行,并且我能够看到所需的结果。但是,如果我想添加更多字段以从表 2 中进行选择,则会出现错误。如何避免这种情况?还有更好的逻辑吗?
  • @shalinimathur 可以使用错误详细信息更新您的问题,如果您可以添加该查询,效果会更好
  • 代码已更新。在此代码中出现错误。请帮忙。
  • @shalinimathur 我无法在您的内部查询中找到列 d 和 e 我可以知道它在哪个表中可用

标签: mysql sql sql-server stored-procedures plsql


【解决方案1】:

尝试使用 distinct 而不是 group by

  Select DISTINCT OutO.routingSequence, tbl2.a as parentOrderNumber, tbl2.c as operationNumber from Operation OutO

【讨论】:

【解决方案2】:

更新的 SQL 如果您想将其作为输出,您必须从内部选择中选择字段

SELECT OutO.routingSequence, 
       tbl2.a AS parentOrderNumber, 
       tbl2.c AS operationNumber,
       tbl2.d as headerStatus,
       tbl2.e as orderNumber
FROM Operation OutO
JOIN (
    SELECT a, MIN(c) c,MIN(d) AS d,MIN(e) as e
    FROM (
        SELECT h.parentordernumber as a, o.operationNumber as c ,h.headerStatus as d, h.orderNumber as e
        FROM header h inner join  operation o 
        on o.ordernumber=h.Parentordernumber
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) < 3
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) > -5
    ) tbl 
    GROUP BY a
) tbl2 
ON OutO.ordernumber = tbl2.a
WHERE OutO.operationnumber = tbl2.c

【讨论】:

  • 试试这个让我知道
  • 我收到以下错误:选择列表中的列 'tbl.d' 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。如果我为字段 d 添加 Group by 子句,那么我将获得我不想要的复制数据。所以在这里,从表 2 中选择多个字段的逻辑应该是什么,其中字段 1 最小,为某些字段 2 提供与表 1 的连接。
  • 我能知道d列的数据类型吗
  • 您试图从该列中获取的值是什么最大值、最小值或类似 taht 的值
  • min列类型是整数,c和d也是整数
【解决方案3】:

对不起,我不明白 d 和 e 和 w 列在哪里是你的 sql 您可以使用 row_number 和 partition by,以像这样按最小值第一行排序

SELECT OutO.routingSequence, 
       tbl2.a AS parentOrderNumber, 
       tbl2.c AS operationNumber,
       tbl2.d as headerStatus,
       tbl2.e as orderNumber
FROM Operation OutO
JOIN (
       select a,c,e,d from (
        SELECT h.parentordernumber a, o.operationNumber c,
               something1 as d,
               something2 as e,
               -- where this = 1 there is your minimum row
               row_number() over (partition by h.parentordernumber
                                      order by w ) Rn
        FROM header h , operation o 
        WHERE o.ordernumber=h.Parentordernumber
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) < 3
        AND (
            SELECT DATEDIFF(day,o.scheduledStartDate, GETDATE()) AS DiffDate
        ) > -5
   ) where Rn = 1 -- here we need only first row in every windows
) tbl2 
ON OutO.ordernumber = tbl2.a
WHERE OutO.operationnumber = tbl2.c

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2022-12-22
相关资源
最近更新 更多