存储过程以使用连接插入行

时间:2016-10-14 16:30:21

标签: database oracle join plsql oracle11g

我有2个表,IP_Address作为公共列。我的要求是获取表1中的IP_Address及其相关详细信息,这些信息是最近90天且不在表2中,并且每晚在一个新表中插入delta

使用的数据库:oracle 11g

表3应包含表1中每个IP_Address的1条记录,这些记录不在表2中

Table 1
--------------------------------------------------
IP_Address    Store_name  source   TRANS_INIT_TIME
--------------------------------------------------
192.168.0.1    abc          e      16-06-29 05:49:16.775265000
192.168.0.1    abc          e      16-07-01 07:44:29.019723000
192.168.0.2    ghi          b      16-07-06 10:53:54.588610000
192.168.0.2    ghi          b      16-07-12 04:04:20.293644000
192.168.0.3    hjg          e      16-07-12 03:54:36.024915000
192.168.0.3    hjg          e      16-07-15 03:46:27.712961000
192.168.0.4    uiu          e      16-09-12 08:57:48.360136000

Table 2
--------------------------
IP.Address    loc    name
--------------------------
192.168.0.2    hjh   uiui

Table 3
--------------------------------
IP_Address  Store_name  source
-------------------------------

我准备了join来从table1获取唯一的IP_Address。

SELECT DISTINCT T1.IP_ADDRESS
    FROM Table1 T1
    LEFT JOIN TABLE2 T2
    ON T1.IP_ADDRESS= T2.IP_ADDRESS
    WHERE T1.TRANS_INIT_TIME BETWEEN SYSDATE-90 AND SYSDATE
    AND T2.IP_ADDRESS IS NULL
    AND T1.IP_ADDRESS IS NOT NULL;

关于如何获取这些返回IP的第一行数据并通过过程将它们插入表3中,我很震惊。任何人都可以帮忙吗?

Expected Result:

Table 3
    --------------------------------
    IP_Address  Store_name  source
    -------------------------------
    192.168.0.1    abc          e 
    192.168.0.2    ghi          b
    192.168.0.3    hjg          e
    192.168.0.4    uiu          e

2 个答案:

答案 0 :(得分:0)

在你的情况下足够测试只有左连接键列为空(这意味着这个键不能与主表中的键匹配

对于插入,您可以使用插入选择

  INSERT INTO Table3 (IP_ADDRESS, Store_name, source)
  SELECT DISTINCT T1.IP_ADDRESS, min(T1.Store_name), min(T1.Source)
      FROM Table1 T1
      LEFT JOIN TABLE2 T2
      ON T1.IP_ADDRESS= T2.IP_ADDRESS
      WHERE T1.TRANS_INIT_TIME BETWEEN SYSDATE-90 AND SYSDATE
      and AND T2.IP_ADDRESS IS NULL
      group by T1.IP_ADDRESS

答案 1 :(得分:0)

您希望IP_ADDRESS在结果集中是唯一的,但您没有指明store_name和source所需的行。可能只是随便挑一个?我不确定你想要哪一个,但这里有三种不同的方法来获得你想要的那个。

使用聚合,您可以按IP_ADDRESS和相关子查询进行分组:

SELECT T1.IP_ADDRESS, MAX(T1.STORE_NAME) AS STORE_NAME, MAX(T1.SOURCE) AS SOURCE
FROM Table1 T1
WHERE NOT EXISTS (SELECT NULL
                  FROM TABLE2 T2
                  WHERE T1.IP_ADDRESS = T2.IP_ADDRESS)
GROUP BY T1.IP_ADDRESS
ORDER BY T1.IP_ADDRESS;

使用聚合和左外连接:

SELECT T1.IP_ADDRESS, MAX(T1.STORE_NAME) AS STORE_NAME, MAX(T1.SOURCE) AS SOURCE
FROM Table1 T1
LEFT OUTER JOIN TABLE2 T2 ON T1.IP_ADDRESS = T2.IP_ADDRESS
WHERE T2.IP_ADDRESS IS NULL
GROUP BY T1.IP_ADDRESS
ORDER BY T1.IP_ADDRESS;

使用分析函数和相关子查询:

SELECT SUB.IP_ADDRESS, SUB.STORE_NAME, SUB.SOURCE
FROM    (
        SELECT T1.IP_ADDRESS, T1.STORE_NAME, T1.SOURCE, ROW_NUMBER() OVER (PARTITION BY T1.IP_ADDRESS) AS ROWNUMBER
        FROM Table1 T1
        WHERE NOT EXISTS (SELECT NULL
                          FROM TABLE2 T2
                          WHERE T1.IP_ADDRESS = T2.IP_ADDRESS)
        ) AS SUB
WHERE SUB.ROWNUMBER = 1
ORDER BY SUB.IP_ADDRESS;