SQL - 如何从多个可能的列名称中 select?
SQL - How to select from mulitple possible columns names?
我需要从几个 table 中获取数据,但是我需要的最后一条数据可以来自三个 table 中的一个,并且每个 table 使用唯一的列名称。我试过在 select 中设置 CASE 语句,但显然我犯了语法错误。我在正确的轨道上吗?有没有更好的办法?这是一个 DB2 数据库。我的访问权限有限,不认为动态 SQL 或创建 table 是一个选项。
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
你为什么不做这样的事情:
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
完全脱离了我的头脑:
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
的列中
我需要从几个 table 中获取数据,但是我需要的最后一条数据可以来自三个 table 中的一个,并且每个 table 使用唯一的列名称。我试过在 select 中设置 CASE 语句,但显然我犯了语法错误。我在正确的轨道上吗?有没有更好的办法?这是一个 DB2 数据库。我的访问权限有限,不认为动态 SQL 或创建 table 是一个选项。
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
你为什么不做这样的事情:
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
完全脱离了我的头脑:
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