Sql 基于某些条件在单个查询中联接表A或表B

Sql 基于某些条件在单个查询中联接表A或表B,sql,oracle11g,Sql,Oracle11g,一个表包含交易信息 grd_market_exchange_cd的值映射到不同的时区名称,可通过以下方式获得: WITH time_zone AS ( SELECT DISTINCT grd.grd_market_exchange_cd, ex.time_zone_name FROM mdm_code.exchange_grd_exchange_map mp JOIN mdm_code.grd_market

一个表包含交易信息

grd_market_exchange_cd的值映射到不同的时区名称,可通过以下方式获得:

WITH time_zone AS (
    SELECT DISTINCT
            grd.grd_market_exchange_cd,
            ex.time_zone_name
        FROM mdm_code.exchange_grd_exchange_map mp
        JOIN mdm_code.grd_market_exchange grd ON grd.grd_market_exchange_cd = mp.grd_market_exchange_cd
        JOIN mdm.market_exchange ex ON ex.market_exchange_cd = mp.market_exchange_cd
        WHERE ex.deactivation_dt IS NULL
        AND EXISTS (
            SELECT 'X'
            FROM ae_os_market_exchange e
            WHERE e.market_exchange_cd = ex.market_exchange_cd
            AND e.jobs_load_id = ( SELECT MAX(jobs_load_id) FROM ae_os_market_exchange )
        )
        AND ex.time_zone_name IS NOT NULL
)
SELECT
    at.trade_id,
    at.trade_execution_tmstmp,
    at.grd_market_exchange_cd,
    tz.time_zone_name
FROM cd_data.allocated_trade at
JOIN time_zone tz ON tz.grd_market_exchange_cd = at.grd_market_exchange_cd
WHERE TRUNC(TRADE_EXECUTION_TMSTMP) = TRUNC(SYSDATE)
AND TRADE_STATUS_CD IN ('EX','TR')
AND trade_id IN (
308983463,
308983465,
308983929,
308983950,
308979467
);

备选案文1: 这是第一条路。但以这种方式获取时区名称的问题是:

  • 在某些情况下,grd_市场_交易所_cd为空
  • 在某些情况下,1个grd_市场_交易所_cd映射到2个或更多时区
  • grd\u市场\u交易所\u cd到时区\u名称映射不是某些代码的映射
除上述三种情况外,我们每次都通过这种方式选择时区名称。如上图所示,如果grd\U market\U exchange\U cd,对于相同的交易,我得到两行 映射到2个时区,如果为空或未映射,则无行

备选案文2: 如果使用grd\U market\u exchange\u cd无法获取时区名称,则必须使用不同的表获取值,如下所示:

SELECT
    at.trade_id,
    at.trade_execution_tmstmp,
    at.grd_market_exchange_cd,
    mme.time_zone_name
FROM cd_data.allocated_trade at
JOIN ae_os_listing_v l ON at.tradable_ent_id = l.cde_tradable_entity_id
JOIN ae_os_market_exchange me ON me.listing_key_id = l.listing_key_id
JOIN mdm.market_exchange mme ON me.market_exchange_cd = mme.market_exchange_cd
WHERE TRUNC(trade_execution_tmstmp) = TRUNC(SYSDATE)
AND at.trade_status_cd IN ('EX','TR')
AND me.jobs_load_id = (SELECT MAX(jobs_load_id) FROM ae_os_market_exchange)
AND me.global_exchange_designation_cd = 'P'
AND trade_id IN (
308983463,
308983465,
308983929,
308983950,
308979467
);


我必须开发一个合并上述两个查询的查询,以便通过选项1选择时区名称(如果grd\U market\u exchange\u cd映射到正好一个时区名称),或者通过选项2选择时区名称(如果我没有通过选项1获得时区名称值)。

aaarrgghh my eyes!!!!但无论如何,首先,如果某个特定代码与2相匹配,您如何建议选择一个时区?最高、最低、第一还是平均?我们需要知道这一点,然后才能提出解决方案。关于另一个问题,要在查找代码时进行“两次尝试”,只需将两个表外部联接,然后按照所需的顺序“合并”结果。但是,除非你以某种方式解决了一个多个问题,否则你无法做到这一点。您可能还需要考虑创建一个新的“清理”时区表,使这个任务变得更容易。如果在第一查询开始时从临时表中获得多于一个或零TimeStAZE,那么我需要使用选项2表来获得TimeStAZONE值,该表将给出单个值。@ AlxPoo-嗨亚历克斯。你能在这里帮我一下吗。我建议你做的是扩展你的带有时区的初始
,只返回有一个时区的记录(使用
HAVING
ROW\u NUMBER
来识别和排除那些有重复的记录)。现在,请加入。现在连接到其他可选时区表。现在,您可以简单地使用
coalesce
从每个表中选择第一个非空结果。在这个阶段,我不会为您重写您的查询。首先,至少尝试用重写您的首字母,以返回在
grd\U market\U exchange\U cd
上唯一的结果(通过使用
HAVING
行数
排除重复项)确定@Nick.McDermaid我将根据您的建议起草一个查询并将其放在这里。谢谢