2014-05-07 50 views
0

我有以下表table1是數據的樣子。自加入Oracle

列1是我的另一個表的外鍵。

Column1 Column2 Column3 
    1  A  06/MAY/14 
    1  A  05/MAY/14 
    1  B  06/MAY/14 
    1  B  01/JAN/00 
    1  A  01/JAN/00 

現在我想找到不同的column1值,它滿足以下條件。

1.atleast一個記錄,其中列2應該是A和欄3應爲(SYSDATE - 1)

AND

2.atleast一個記錄,其中列2應該是B和欄3應爲(SYSDATE - 1 )

含義alteast一個A和B應該有自己的列3填充(SYSDATE - 1)

我已經寫了下面的查詢,請告訴我是不是做錯了什麼。

我也想知道如果我做加盟的正確方法。該表包含大約5萬條記錄,性能應該沒問題。

SELECT DISTINCT COLUMN1 FROM 
    TABLE1 A 
    JOIN 
    TABLE1 B ON (A.COLUMN1 = B.COLUMN1) 
    WHERE 
    ((TRUNC(A.COLUMN3) - TRUNC(A.COLUMN3) = 0) 
    AND TRUNC(A.COLUMN3) = TRUNC(SYSDATE - 1) 
    AND TRUNC(B.COLUMN3) = TRUNC(SYSDATE - 1) 
    AND A.COLUMN2 = 'A' 
    AND B.COLUMN2 = 'B' 
    AND TO_CHAR(A.COLUMN3, 'DD-MON-YY') != '01-JAN-00' 
    AND TO_CHAR(B.COLUMN3, 'DD-MON-YY') != '01-JAN-00' 
    ); 

回答

0

這應該工作

SELECT DISTINCT A.column1   -- Obtain distinct from A 
FROM table1 A      -- TableA 
     join table1 B     -- TableB 
     ON A.column1 = B.column1 -- Joining them on Column1 
WHERE A.column3 = SYSDATE - 1  -- Yesterdays data on Table A 
     AND A.column2 = 'A'   -- A values 
     AND B.column2 = 'B';   -- B Values 

注意:在你的測試用例無明顯。所以嘗試一個獨特的關鍵。

+0

'AND B.column3 = SYSDATE - 1'是沒有必要的。 'A.column3 = SYSDATE - 1'應該注意這一點。 'A'和'B'是同一張桌子。 – Nivas

+0

噢。非常感謝。忘記 – SriniV

+0

謝謝,你還可以告訴我爲什麼當所有包含column3爲'01/JAN/00'的行時,下面的語句沒有返回行。在(由列1分區)作爲語句 從表1中選擇不同的列1,最大值(欄3),其中列1(1) – Freaky1

0

出於性能對比一個與子選擇和組:

SELECT COLUMN1 FROM (
    SELECT 
     COLUMN1, 
     COUNT(COLUMN2) CNT 
    FROM (
     SELECT DISTINCT 
      COLUMN1, 
      COLUMN2 
     FROM TABLE1 
     WHERE TRUNCATE(COLUMN3) = SYSDATE - 1 AND 
      (COLUMN2 = 'A' OR COLUMN2 = 'B')) 
    GOUP BY COLUMN1) 
WHERE CNT = 2 
+0

感謝您對性能比較的迴應 – Freaky1