You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于日期列合并含CTE的两个SQL查询结果的语法求助

问题需求

需要基于「date」列(即两个查询结果中的d_dates.date_date字段)对以下两个SQL查询的结果执行**内连接(INNER JOIN)**合并操作,但其中一个查询包含CTE(公共表表达式),且两个查询本身已有多表连接逻辑,不清楚正确的实现语法。

原始查询语句

Query1

(SELECT
    (TO_CHAR(TO_DATE(d_dates."DAY" ), 'YYYY-MM-DD')) AS "d_dates.date_date",
    COALESCE(SUM(CASE WHEN (( (f_traffic."D_TIMES_ID") = -1  )) AND (( d_platforms."PLATFORM"  ) = 'App') THEN ( f_traffic."VISITS" ) ELSE NULL END), 0) AS app_adobe
FROM DATA_MART.F_TRAFFIC  AS f_traffic
INNER JOIN DATA_MART.D_DATES  AS d_dates ON (f_traffic."WH_DATE_ID") = (d_dates."ID")
INNER JOIN DATA_MART.D_OBJECTS  AS d_objects ON
             (f_traffic."D_OBJECTS_ID") = (d_objects."ID")
INNER JOIN DATA_MART.D_PLATFORMS  AS d_platforms ON (f_traffic."D_PLATFORMS_ID") = (d_platforms."ID")
WHERE ((( d_dates."DAY"  ) >= ((TO_DATE(DATEADD('day', -2, CURRENT_DATE())))) AND ( d_dates."DAY"  ) < ((TO_DATE(DATEADD('day', 2, DATEADD('day', -2, CURRENT_DATE()))))))) AND (d_objects."OBJECT_GROUP" ) = 'WELT' AND (d_objects."OBJECT_NAME" ) = 'WELT'
GROUP BY
    (TO_DATE(d_dates."DAY" ))
ORDER BY
    1)

Query2

(WITH f_ivw_measures_with_plan_data AS (SELECT
      coalesce (f_ivw_measures.WH_DATE_ID, f_ivw_forecasts.WH_DATE_ID, f_ivw_plan_data.WH_DATE_ID)  AS WH_DATE_ID,
      f_ivw_plan_data.PLANNED_PAGE_IMPRESSIONS,
      case when to_date(concat(left(f_ivw_forecasts."WH_DATE_ID" ,4),'-' ,substr(f_ivw_forecasts."WH_DATE_ID" ,5,2),'-',right(f_ivw_forecasts."WH_DATE_ID" ,2)
      ))  >= current_date then  f_ivw_forecasts.VISITS else f_ivw_measures.VISITS end  AS VISITS_FORECAST,
      case when to_date(concat(left(f_ivw_forecasts."WH_DATE_ID" ,4),'-' ,substr(f_ivw_forecasts."WH_DATE_ID" ,5,2),'-',right(f_ivw_forecasts."WH_DATE_ID" ,2)
      ))  >= current_date then  f_ivw_forecasts.PAGE_IMPRESSIONS else f_ivw_measures.PAGE_IMPRESSIONS end AS PAGE_IMPRESSIONS_FORECAST
 FROM DATA_MART.F_IVW_MEASURES AS f_ivw_measures
      FULL OUTER JOIN DATA_MART.F_IVW_FORECASTS AS f_ivw_forecasts
        ON f_ivw_measures.WH_DATE_ID = f_ivw_forecasts.WH_DATE_ID
      AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_forecasts.D_IVW_OFFERS_ID
      AND f_ivw_measures.D_IVW_CODES_ID = f_ivw_forecasts.D_IVW_CODES_ID
      FULL OUTER JOIN DATA_MART.F_IVW_PLANNING_DATA AS f_ivw_plan_data
        ON f_ivw_measures.WH_DATE_ID = f_ivw_plan_data.WH_DATE_ID
      AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_plan_data.D_IVW_OFFERS_ID
       )
SELECT
    (TO_CHAR(TO_DATE(d_dates."DAY" ), 'YYYY-MM-DD')) AS "d_dates.date_date",
    COALESCE(SUM(CASE WHEN ((( d_ivw_offers."OFFER"  ) NOT IN ('AWPBILD', 'CTVBILD') OR (( d_ivw_offers."OFFER"  )) IS NULL)) AND (( d_platforms."PLATFORM"  ) = 'Desktop') THEN ( f_ivw_measures_with_plan_data.VISITS_FORECAST  )  ELSE NULL END), 0) AS web
FROM f_ivw_measures_with_plan_data
INNER JOIN DATA_MART.D_DATES  AS d_dates ON (f_ivw_measures_with_plan_data."WH_DATE_ID") = (d_dates."ID")
INNER JOIN DATA_MART.D_OBJECTS  AS d_objects ON (f_ivw_measures_with_plan_data."D_OBJECTS_ID") = (d_objects."ID")
INNER JOIN DATA_MART.D_IVW_OFFERS AS d_ivw_offers ON f_ivw_measures_with_plan_data."D_IVW_OFFERS_ID" = d_ivw_offers."ID"
INNER JOIN DATA_MART.D_PLATFORMS AS d_platforms ON f_ivw_measures_with_plan_data."D_PLATFORMS_ID" = d_platforms."ID"
WHERE (((( d_dates."DAY"  )) < (TO_DATE(DATEADD('minute', 0, DATE_TRUNC('minute', CURRENT_TIMESTAMP())))))) AND (d_objects."OBJECT_GROUP" ) = 'WELT' AND (d_objects."OBJECT_NAME" ) = 'WELT'
GROUP BY
    (TO_DATE(d_dates."DAY" ))
ORDER BY
    1 DESC) 

实现方案

以下提供两种可行的内连接实现方式,同时修正了原Query2中的语法错误与逻辑遗漏:

方式一:子查询直接连接

将两个查询分别作为子查询,通过d_dates.date_date字段执行内连接:

SELECT
    q1."d_dates.date_date",
    q1.app_adobe,
    q2.web
FROM
    (
        -- Query1 原始逻辑
        SELECT
            TO_CHAR(TO_DATE(d_dates."DAY"), 'YYYY-MM-DD') AS "d_dates.date_date",
            COALESCE(SUM(CASE WHEN f_traffic."D_TIMES_ID" = -1 AND d_platforms."PLATFORM" = 'App' THEN f_traffic."VISITS" ELSE NULL END), 0) AS app_adobe
        FROM DATA_MART.F_TRAFFIC AS f_traffic
        INNER JOIN DATA_MART.D_DATES AS d_dates ON f_traffic."WH_DATE_ID" = d_dates."ID"
        INNER JOIN DATA_MART.D_OBJECTS AS d_objects ON f_traffic."D_OBJECTS_ID" = d_objects."ID"
        INNER JOIN DATA_MART.D_PLATFORMS AS d_platforms ON f_traffic."D_PLATFORMS_ID" = d_platforms."ID"
        WHERE 
            d_dates."DAY" >= TO_DATE(DATEADD('day', -2, CURRENT_DATE()))
            AND d_dates."DAY" < TO_DATE(DATEADD('day', 2, DATEADD('day', -2, CURRENT_DATE())))
            AND d_objects."OBJECT_GROUP" = 'WELT'
            AND d_objects."OBJECT_NAME" = 'WELT'
        GROUP BY TO_DATE(d_dates."DAY")
    ) q1
INNER JOIN
    (
        -- Query2 修正后的逻辑
        WITH f_ivw_measures_with_plan_data AS (
            SELECT
                COALESCE(f_ivw_measures.WH_DATE_ID, f_ivw_forecasts.WH_DATE_ID, f_ivw_plan_data.WH_DATE_ID) AS WH_DATE_ID,
                f_ivw_plan_data.PLANNED_PAGE_IMPRESSIONS,
                CASE 
                    WHEN TO_DATE(CONCAT(LEFT(f_ivw_forecasts."WH_DATE_ID",4),'-',SUBSTR(f_ivw_forecasts."WH_DATE_ID",5,2),'-',RIGHT(f_ivw_forecasts."WH_DATE_ID",2))) >= CURRENT_DATE 
                    THEN f_ivw_forecasts.VISITS 
                    ELSE f_ivw_measures.VISITS 
                END AS VISITS_FORECAST,
                CASE 
                    WHEN TO_DATE(CONCAT(LEFT(f_ivw_forecasts."WH_DATE_ID",4),'-',SUBSTR(f_ivw_forecasts."WH_DATE_ID",5,2),'-',RIGHT(f_ivw_forecasts."WH_DATE_ID",2))) >= CURRENT_DATE 
                    THEN f_ivw_forecasts.PAGE_IMPRESSIONS 
                    ELSE f_ivw_measures.PAGE_IMPRESSIONS 
                END AS PAGE_IMPRESSIONS_FORECAST,
                f_ivw_measures.D_IVW_OFFERS_ID,
                f_ivw_measures.D_PLATFORMS_ID,
                f_ivw_measures.D_OBJECTS_ID
            FROM DATA_MART.F_IVW_MEASURES AS f_ivw_measures
            FULL OUTER JOIN DATA_MART.F_IVW_FORECASTS AS f_ivw_forecasts
                ON f_ivw_measures.WH_DATE_ID = f_ivw_forecasts.WH_DATE_ID
                AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_forecasts.D_IVW_OFFERS_ID
                AND f_ivw_measures.D_IVW_CODES_ID = f_ivw_forecasts.D_IVW_CODES_ID
            FULL OUTER JOIN DATA_MART.F_IVW_PLANNING_DATA AS f_ivw_plan_data
                ON f_ivw_measures.WH_DATE_ID = f_ivw_plan_data.WH_DATE_ID
                AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_plan_data.D_IVW_OFFERS_ID
        )
        SELECT
            TO_CHAR(TO_DATE(d_dates."DAY"), 'YYYY-MM-DD') AS "d_dates.date_date",
            COALESCE(SUM(CASE WHEN (d_ivw_offers."OFFER" NOT IN ('AWPBILD', 'CTVBILD') OR d_ivw_offers."OFFER" IS NULL) AND d_platforms."PLATFORM" = 'Desktop' THEN f_ivw_measures_with_plan_data.VISITS_FORECAST ELSE NULL END), 0) AS web
        FROM f_ivw_measures_with_plan_data
        INNER JOIN DATA_MART.D_DATES AS d_dates ON f_ivw_measures_with_plan_data."WH_DATE_ID" = d_dates."ID"
        INNER JOIN DATA_MART.D_OBJECTS AS d_objects ON f_ivw_measures_with_plan_data."D_OBJECTS_ID" = d_objects."ID"
        INNER JOIN DATA_MART.D_IVW_OFFERS AS d_ivw_offers ON f_ivw_measures_with_plan_data."D_IVW_OFFERS_ID" = d_ivw_offers."ID"
        INNER JOIN DATA_MART.D_PLATFORMS AS d_platforms ON f_ivw_measures_with_plan_data."D_PLATFORMS_ID" = d_platforms."ID"
        WHERE 
            d_dates."DAY" < TO_DATE(DATEADD('minute', 0, DATE_TRUNC('minute', CURRENT_TIMESTAMP())))
            AND d_objects."OBJECT_GROUP" = 'WELT'
            AND d_objects."OBJECT_NAME" = 'WELT'
        GROUP BY TO_DATE(d_dates."DAY")
    ) q2
ON q1."d_dates.date_date" = q2."d_dates.date_date"
ORDER BY q1."d_dates.date_date";

方式二:统一CTE结构

将两个查询的结果都定义为顶层CTE,再执行内连接,可读性更强:

WITH query1_results AS (
    -- Query1 逻辑
    SELECT
        TO_CHAR(TO_DATE(d_dates."DAY"), 'YYYY-MM-DD') AS date_date,
        COALESCE(SUM(CASE WHEN f_traffic."D_TIMES_ID" = -1 AND d_platforms."PLATFORM" = 'App' THEN f_traffic."VISITS" ELSE NULL END), 0) AS app_adobe
    FROM DATA_MART.F_TRAFFIC AS f_traffic
    INNER JOIN DATA_MART.D_DATES AS d_dates ON f_traffic."WH_DATE_ID" = d_dates."ID"
    INNER JOIN DATA_MART.D_OBJECTS AS d_objects ON f_traffic."D_OBJECTS_ID" = d_objects."ID"
    INNER JOIN DATA_MART.D_PLATFORMS AS d_platforms ON f_traffic."D_PLATFORMS_ID" = d_platforms."ID"
    WHERE 
        d_dates."DAY" >= TO_DATE(DATEADD('day', -2, CURRENT_DATE()))
        AND d_dates."DAY" < TO_DATE(DATEADD('day', 2, DATEADD('day', -2, CURRENT_DATE())))
        AND d_objects."OBJECT_GROUP" = 'WELT'
        AND d_objects."OBJECT_NAME" = 'WELT'
    GROUP BY TO_DATE(d_dates."DAY")
),
query2_results AS (
    -- Query2 修正后的逻辑
    WITH f_ivw_measures_with_plan_data AS (
        SELECT
            COALESCE(f_ivw_measures.WH_DATE_ID, f_ivw_forecasts.WH_DATE_ID, f_ivw_plan_data.WH_DATE_ID) AS WH_DATE_ID,
            f_ivw_plan_data.PLANNED_PAGE_IMPRESSIONS,
            CASE 
                WHEN TO_DATE(CONCAT(LEFT(f_ivw_forecasts."WH_DATE_ID",4),'-',SUBSTR(f_ivw_forecasts."WH_DATE_ID",5,2),'-',RIGHT(f_ivw_forecasts."WH_DATE_ID",2))) >= CURRENT_DATE 
                THEN f_ivw_forecasts.VISITS 
                ELSE f_ivw_measures.VISITS 
            END AS VISITS_FORECAST,
            CASE 
                WHEN TO_DATE(CONCAT(LEFT(f_ivw_forecasts."WH_DATE_ID",4),'-',SUBSTR(f_ivw_forecasts."WH_DATE_ID",5,2),'-',RIGHT(f_ivw_forecasts."WH_DATE_ID",2))) >= CURRENT_DATE 
                THEN f_ivw_forecasts.PAGE_IMPRESSIONS 
                ELSE f_ivw_measures.PAGE_IMPRESSIONS 
            END AS PAGE_IMPRESSIONS_FORECAST,
            f_ivw_measures.D_IVW_OFFERS_ID,
            f_ivw_measures.D_PLATFORMS_ID,
            f_ivw_measures.D_OBJECTS_ID
        FROM DATA_MART.F_IVW_MEASURES AS f_ivw_measures
        FULL OUTER JOIN DATA_MART.F_IVW_FORECASTS AS f_ivw_forecasts
            ON f_ivw_measures.WH_DATE_ID = f_ivw_forecasts.WH_DATE_ID
            AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_forecasts.D_IVW_OFFERS_ID
            AND f_ivw_measures.D_IVW_CODES_ID = f_ivw_forecasts.D_IVW_CODES_ID
        FULL OUTER JOIN DATA_MART.F_IVW_PLANNING_DATA AS f_ivw_plan_data
            ON f_ivw_measures.WH_DATE_ID = f_ivw_plan_data.WH_DATE_ID
            AND f_ivw_measures.D_IVW_OFFERS_ID = f_ivw_plan_data.D_IVW_OFFERS_ID
    )
    SELECT
        TO_CHAR(TO_DATE(d_dates."DAY"), 'YYYY-MM-DD') AS date_date,
        COALESCE(SUM(CASE WHEN (d_ivw_offers."OFFER" NOT IN ('AWPBILD', 'CTVBILD') OR d_ivw_offers."OFFER" IS NULL) AND d_platforms."PLATFORM" = 'Desktop' THEN f_ivw_measures_with_plan_data.VISITS_FORECAST ELSE NULL END), 0) AS web
    FROM f_ivw_measures_with_plan_data
    INNER JOIN DATA_MART.D_DATES AS d_dates ON f_ivw_measures_with_plan_data."WH_DATE_ID" = d_dates."ID"
    INNER JOIN DATA_MART.D_OBJECTS AS d_objects ON f_ivw_measures_with_plan_data."D_OBJECTS_ID" = d_objects."ID"
    INNER JOIN DATA_MART.D_IVW_OFFERS AS d_ivw_offers ON f_ivw_measures_with_plan_data."D_IVW_OFFERS_ID" = d_ivw_offers."ID"
    INNER JOIN DATA_MART.D_PLATFORMS AS d_platforms ON f_ivw_measures_with_plan_data."D_PLATFORMS_ID" = d_platforms."ID"
    WHERE 
        d_dates."DAY" < TO_DATE(DATEADD('minute', 0, DATE_TRUNC('minute', CURRENT_TIMESTAMP())))
        AND d_objects."OBJECT_GROUP" = 'WELT'
        AND d_objects."OBJECT_NAME" = 'WELT'
    GROUP BY TO_DATE(d_dates."DAY")
)
SELECT
    q1.date_date,
    q1.app_adobe,
    q2.web
FROM query1_results q1
INNER JOIN query2_results q2 ON q1.date_date = q2.date_date
ORDER BY q1.date_date;

关键修正说明

  1. 修正了原Query2中WH_DATE_ID字段后的无效符号..,,,
  2. 原Query2中引用了`
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:49:37