2017-11-18 237 views
1

我有2個表,我需要使用CTE。我需要使用兩個表的CTE

我需要行一組Table_2行從Table_1,這樣dActiveDate是最大的table_1,並​​爲table_1.dcidKala = table_2.dcidKala

CREATE TABLE #Table_1 
(
    dcidKala    INT, 
    dcPercentDiscount  FLOAT, 
    dActiveDate   DATE 
) 

CREATE TABLE #Table_2 
(
    dcRow   INT, 
    dcidKala  INT, 
    dcNum   FLOAT, 
    dDateFactor  DATE 
) 

INSERT INTO #Table_1 
    (
    dcidKala, 
    dcPercentDiscount, 
    dActiveDate 
) 
VALUES 
(109,10,'2017-08-23'), 
(109, 15, '2017-10-12'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 
    (
    dcRow, 
    dcidKala, 
    dcNum, 
    dDateFactor 
) 
VALUES 
(1,109,1, '2017-10-05' ), 
(2, 109, 2, '2017-10-07'), 
(3, 109, 1, '2017-10-14'), 
(4, 109, 5, '2017-10-19'), 
(5, 100, 2, '2017-01-25') 

;WITH cte AS 
(
    SELECT th.dcPercentDiscount, 
      tb.dcRow, 
      ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate) AS 
      rn 
    FROM #Table_1 th 
      INNER JOIN #Table_2 tb 
       ON tb.dcidKala = th.dcidKala 
       AND tb.dDateFactor >= th.dActiveDate 
) 

SELECT * 
FROM #Table_2 t2 
     LEFT JOIN cte t3 
      ON t2.dcRow = t3.dcRow 
      AND t3.rn = 1 


DROP TABLE [#Table_1] 
DROP TABLE [#Table_2] 

--result myCode is: 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 10 3 1 
    --4 109 5 2017-10-19 10 4 1 
    --5 100 2 2017-01-25 20 5 1 

    --Rows 3 and Rows 4 is wrong 

    --i need this result : 
    -- on Result From table_1 on table_2 
    --1 109 1 2017-10-05 10 1 1 
    --2 109 2 2017-10-07 10 2 1 
    --3 109 1 2017-10-14 15 3 1 
    --4 109 5 2017-10-19 15 4 1 
    --5 100 2 2017-01-25 20 5 1 

對於TABLE_2從TABLE_1只是一個結果,每一行是最大的 dActiveDate小dDateFactor

請幫我

謝謝

+0

您正在使用哪種[DBMS](https://en.wikipedia.org/wiki/DBMS)產品? Postgres的?甲骨文? 「_SQL_」只是一種查詢語言,而不是特定數據庫產品的名稱。 –

回答

1

您可以使用此。

;WITH cte AS 
(
    SELECT 
     th.dcPercentDiscount, tb.dcRow, 
     ROW_NUMBER() OVER(PARTITION BY th.dcidKala, tb.dcRow ORDER BY th.dActiveDate DESC) AS rn 
    FROM 
     Table_1 th 
    INNER JOIN 
     Table_2 tb ON tb.dcidKala = th.dcidKala 
        AND tb.dDateFactor >= th.dActiveDate 
) 
SELECT * 
FROM Table_2 t2 
LEFT JOIN cte t3 ON t2.dcRow = t3.dcRow and t3.rn=1 
+0

謝謝你的回覆 我測試你的代碼與差異數據和不幸的是錯誤的.... 你能編輯它嗎?sarslan? –

+0

你能分享你的不同數據嗎? –

+0

我做了更新。 –

1
CREATE TABLE #Table_1 (dcidKala   INT, 
         dcPercentDiscount FLOAT, 
         dActiveDate  DATE) 

CREATE TABLE #Table_2 (dcRow  INT, 
         dcidKala INT, 
         dcNum  FLOAT, 
         dDateFactor DATE) 

INSERT INTO #Table_1 (dcidKala, 
         dcPercentDiscount, 
         dActiveDate) 
VALUES (100, 10, '2017-01-01'), 
(101, 15, '2017-01-02'), 
(100, 20, '2017-01-20'), 
(102, 20, '2017-01-20') 

INSERT INTO #Table_2 (dcRow, 
         dcidKala, 
         dcNum, 
         dDateFactor) 
VALUES (1, 100, 1, '2017-01-05'), 
(2, 100, 2, '2017-01-09'), 
(3, 101, 1, '2017-01-01'), 
(4, 101, 5, '2017-01-20'), 
(5, 100, 2, '2017-01-25') 

SELECT * 
FROM [#Table_2] AS [t2] 
CROSS APPLY ( SELECT TOP 1 * 
       FROM ( SELECT TOP 1 [t1].[dcidKala], 
            [t1].[dcPercentDiscount], 
            [t1].[dActiveDate] 
          FROM [#Table_1] AS [t1] 
          WHERE [t1].[dcidKala] = [t2].[dcidKala] 
            AND [t2].[dDateFactor] >= [t1].[dActiveDate] 
          ORDER BY [t1].[dActiveDate] DESC 
          UNION ALL 
          SELECT NULL, 
            NULL, 
            NULL) t3 
       ORDER BY CASE 
          WHEN [t2].[dcidKala] IS NOT NULL THEN 0 
          ELSE 1 
         END) AS t1 

DROP TABLE [#Table_1] 
DROP TABLE [#Table_2]