【问题标题】:SQL Using inner query in left joinSQL 在左连接中使用内部查询
【发布时间】:2013-08-28 23:51:12
【问题描述】:

我有以下两张表 ONE & TWO

ONE           TWO

ID            ID  CODE  
-----         ---------
1             1    1
2             1    2
3             2    1
4             3    1  
5             3    2  
              3    3

需要输出

ID    CODE  
----------  
1     2  
2     1  
3     3  
4     NULL  
5     NULL  

我使用了以下查询,但它抛出错误“与 JOIN 运算符或 MERGE 语句关联的 ON 子句无效。

SELECT  A.ID
       ,B.CODE
FROM   ONE A 
LEFT JOIN
       TWO B
ON     A.ID = B.ID
   AND B.CODE = (
                   SELECT 
                         MAX(Z.CODE)
                   FROM TWO Z
                   WHERE Z.ID = A.ID
            )

【问题讨论】:

  • Oracle 不支持在 Join 条件中使用子查询,因此请使用表名中的查询,就像我在下面给出的答案一样...

标签: mysql sql sql-server oracle db2


【解决方案1】:

你可以通过连接和聚合来做到这一点(如果我理解正确的逻辑的话):

select ONE.id, max(TWO.CODE)
from ONE left outer join
     TWO
     on ONE.id = TWO.id
group by ONE.id;

【讨论】:

    【解决方案2】:

    由于你也标记了 SQL-Server,你可以使用ROW_NUMBER:

    WITH CTE AS
    (
        SELECT ONE.ID,  TWO.CODE,
            RN = ROW_NUMBER() OVER (PARTITION BY ONE.ID ORDER BY TWO.CODE DESC)
        FROM ONE LEFT OUTER JOIN TWO
            ON ONE.ID=TWO.ID
    )
    SELECT  ID, CODE FROM CTE WHERE RN = 1
    

    DEMO

    【讨论】:

      【解决方案3】:
      SELECT  A.ID
         ,B.CODE
      FROM   ONE A 
      LEFT outer JOIN
         (select id,max(code) CODE from two group by id) B
      ON     A.ID = B.ID
      

      我相信这就是你要找的......

      【讨论】:

      • 你也可以使用@Gordan给出的答案,不需要我们执行子查询...
      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多