Sql 基于某些条件在单个查询中联接表A或表B
一个表包含交易信息 grd_market_exchange_cd的值映射到不同的时区名称,可通过以下方式获得: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
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名称映射不是某些代码的映射
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我将根据您的建议起草一个查询并将其放在这里。谢谢