【问题标题】:SQL - How to select from mulitple possible columns names?SQL - 如何从多个可能的列名中进行选择?
【发布时间】:2015-04-30 21:13:45
【问题描述】:

我需要从多个表中获取数据,但我需要的最后一条数据可以来自三个表中的一个,并且每个表使用唯一的列名。我尝试在 select 中设置 CASE 语句,但我显然犯了语法错误。我在正确的轨道上吗?有没有更好的办法?这是一个 DB2 数据库。我的访问权限有限,不认为动态 SQL 或创建表是一种选择。

SELECT M1.MESSAGE_ID, M1.MESSAGE_NAME, M1.CREATED_DATETIME, M1.MESSAGE_SIZE, M2.PATH,
 case when select EXTRACTABLE_COUNT from MBX_EXTRACT_COUNT where exists (select M1.MESSAGE_ID from MBX_EXTRACT_COUNT)
    then select EXTRACTABLE_COUNT from MBX_EXTRACT_COUNT
 when select EXTRACTABLE_UNTIL from MBX_TIL_COUNT where exists (select M1.MESSAGE_ID from MBX_TIL_COUNT)
    then select EXTRACTABLE_UNTIL from MBX_TIL_COUNT
 when select EXTRACTABLE from MBX_EXTRACTABLE where exists (select M1.MESSAGE_ID from MBX_EXTRACTABLE)
    then select EXTRACTABLE from MBX_EXTRACTABLE
 end as EXTRACT_VALUE
FROM MBX_MESSAGE M1
 left JOIN MBX_MAILBOX M2
    ON M1.MAILBOX_ID = M2.MAILBOX_ID
 left JOIN MBX_EXTRACT_COUNT M3
    ON M1.MESSAGE_ID = M3.MESSAGE_ID     
 left JOIN MBX_EXTRACT_TIL M4
    ON M1.MESSAGE_ID = M4.MESSAGE_ID
 left JOIN MBX_EXTRACTABLE M5
    ON M1.MESSAGE_ID = M4.MESSAGE_ID

【问题讨论】:

    标签: sql select db2 case


    【解决方案1】:

    非常想不通:

    SELECT 
      M1.MESSAGE_ID, 
      M1.MESSAGE_NAME, 
      M1.CREATED_DATETIME, 
      M1.MESSAGE_SIZE, 
      EV.EXTRACT_VALUE,
      M2.PATH
    FROM MBX_MESSAGE MI
    LEFT JOIN (
      SELECT 
        MESSAGE_ID, 
        EXTRACTABLE_COUNT AS EXTRACT_VALUE
      FROM MBX_EXTRACT_COUNT 
    
      UNION ALL
    
      SELECT
        MESSAGE_ID,
        EXTRACTABLE_UNTIL AS EXTRACT_VALUE
      FROM MBX_TIL_COUNT
    
      UNION ALL
    
      SELECT
        MESSAGE_ID,
        EXTRACTABLE AS EXTRACT_VALUE
      FROM MBX_EXTRACTABLE
    
    ) AS EV ON MI.MESSAGE_ID = EV.MESSAGE_ID
    LEFT JOIN MBX_MAILBOX M2
      ON M1.MAILBOX_ID = M2.MAILBOX_ID
    

    我确信这可以改进一点,但是像这样使用带有UNION ALL 的子查询应该将所有内容都放到一个名为EXTRACT_VALUE 的列中

    【讨论】:

    • 这成功了!我不得不做一些修改,因为我忘了提到 EXTRACTABLE_UNTIL 是一个日期值。感谢您的帮助
    【解决方案2】:

    你为什么不做类似的事情:

    LEFT JOIN ( 
             SELECT MESSAGE_ID,     
                    EXTRACTABLE_COUNT EXTRACT_VALUE
               FROM MBX_EXTRACT_COUNT) M3
        ON M1.MESSAGE_ID = M3.MESSAGE_ID     
    LEFT JOIN ( 
             SELECT MESSAGE_ID,     
                    EXTRACTABLE_UNTIL EXTRACT_VALUE
               FROM MBX_EXTRACT_TIL) M4
        ON M1.MESSAGE_ID = M4.MESSAGE_ID
    LEFT JOIN ( 
             SELECT MESSAGE_ID,     
                    EXTRACTABLE EXTRACT_VALUE
               FROM MBX_EXTRACTABLE) M5
        ON M1.MESSAGE_ID = M5.MESSAGE_ID
    

    这样一来所有的列都应该有相同的名字,那么COALESCE就足够了。

    反正你最后的LEFT JOIN 条件不对,应该是 M5 而不是 M4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      相关资源
      最近更新 更多