Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 获取多行值相等的记录sql server_Oracle_Sql Server 2008_Plsql - Fatal编程技术网

Oracle 获取多行值相等的记录sql server

Oracle 获取多行值相等的记录sql server,oracle,sql-server-2008,plsql,Oracle,Sql Server 2008,Plsql,我有如下SQL模式: ANo | Code |Type | Date1 | EX_Date|Rd_Date |CPS | Tax ______|_______| _____|______ |_ ______|_______ |____|__________ B1 | AM | T |4/1/2014|3/2/2012|4/2/2010| 99 | 1 B1 | AM | T |5/2/2014|3/5/2012|4/2/2010| 99 | 1

我有如下SQL模式:

ANo   | Code  |Type  | Date1  | EX_Date|Rd_Date |CPS | Tax 
______|_______| _____|______  |_ ______|_______ |____|__________
B1    |   AM  |  T   |4/1/2014|3/2/2012|4/2/2010| 99 | 1
B1    |   AM  |  T   |5/2/2014|3/5/2012|4/2/2010| 99 | 1
p1    |   4   |  X   |5/8/2014|3/4/2012|5/9/2015| 22 | 2
p2    |   3   |  Y   |8/1/2015|5/6/2011|7/8/2010| 20 | 3
这里我想得到多行是相等值的记录。条件是ANo、Code、Type、CPS、Tax需要直接比较。而且,如果Ex_Date和Rd_Date相等或彼此相差10天,那么它将被视为重复

因此,上述模式应如下所示:

ANo   | Code  |Type  | Date1  | EX_Date|Rd_Date |CPS | Tax 
______|_______| _____|______  |_ ______|_______ |____|__________
B1    |   AM  |  T   |4/1/2014|3/2/2012|4/2/2010| 99 | 1
B1    |   AM  |  T   |5/2/2014|3/5/2012|4/2/2010| 99 | 1

如果有人能帮助我使用PLSQL,那就太好了。Sql server也可以。

如果需要显示副本,它将类似于

select t1.* from Test t1
join Test t2 on 1=1
and t2.ANo = t1.ANo
and t2.Code = t1.Code
and t2."Type" = t1."Type"
and t2.CPS = t1.CPS
and t2.Tax = t1.Tax
and abs(t1.EX_Date - t2.EX_Date)  <= 10
and abs(t1.Rd_Date - t2.Rd_Date)  <= 10
group by t1.ANo, t1.Code,t1."Type", t1.Date1, t1.EX_Date,t1.Rd_Date,t1.CPS, t1.Tax
having count(t1.*) > 1;
从测试t1中选择t1.*
在1=1时加入测试t2
t2.ANo=t1.ANo
t2.Code=t1.Code
t2.“类型”=t1.“类型”
t2.CPS=t1.CPS
t2.税=t1.税
和abs(t1.EX_日期-t2.EX_日期)

Oracle 11g R2架构设置

CREATE TABLE Test ( ANo, Code,"Type", Date1, EX_Date,Rd_Date,CPS, Tax ) AS
          SELECT 'B1', 'AM', 'T', TO_DATE( '2014-04-01', 'YYYY-MM-DD' ), TO_DATE( '2012-03-02', 'YYYY-MM-DD' ), TO_DATE( '2010-04-02', 'YYYY-MM-DD' ), 99, 1 FROM DUAL
UNION ALL SELECT 'B1', 'AM', 'T', TO_DATE( '2014-05-02', 'YYYY-MM-DD' ), TO_DATE( '2012-03-05', 'YYYY-MM-DD' ), TO_DATE( '2010-04-02', 'YYYY-MM-DD' ), 99, 1 FROM DUAL
UNION ALL SELECT 'p1', '4',  'X', TO_DATE( '2014-05-08', 'YYYY-MM-DD' ), TO_DATE( '2012-03-04', 'YYYY-MM-DD' ), TO_DATE( '2015-05-09', 'YYYY-MM-DD' ), 22, 2 FROM DUAL
UNION ALL SELECT 'p2', '3',  'Y', TO_DATE( '2015-08-01', 'YYYY-MM-DD' ), TO_DATE( '2011-05-06', 'YYYY-MM-DD' ), TO_DATE( '2010-07-08', 'YYYY-MM-DD' ), 20, 3 FROM DUAL;
SELECT *
FROM   TEST t
WHERE  EXISTS (
         SELECT 'X'
         FROM   TEST x
         WHERE  x.ROWID  <> t.ROWID
         AND    x.ANo    = t.Ano
         AND    x.Code   = t.Code
         AND    x."Type" = t."Type"
         AND    x.cps    = t.cps
         AND    x.tax    = t.tax
         AND    x.EX_DATE BETWEEN t.EX_DATE - INTERVAL '10' DAY AND t.EX_DATE + INTERVAL '10' DAY
         AND    x.RD_DATE BETWEEN t.RD_DATE - INTERVAL '10' DAY AND t.RD_DATE + INTERVAL '10' DAY
       )
| ANO | CODE | Type |                   DATE1 |                 EX_DATE |                 RD_DATE | CPS | TAX |
|-----|------|------|-------------------------|-------------------------|-------------------------|-----|-----|
|  B1 |   AM |    T |   May, 02 2014 00:00:00 | March, 05 2012 00:00:00 | April, 02 2010 00:00:00 |  99 |   1 |
|  B1 |   AM |    T | April, 01 2014 00:00:00 | March, 02 2012 00:00:00 | April, 02 2010 00:00:00 |  99 |   1 |
查询1

CREATE TABLE Test ( ANo, Code,"Type", Date1, EX_Date,Rd_Date,CPS, Tax ) AS
          SELECT 'B1', 'AM', 'T', TO_DATE( '2014-04-01', 'YYYY-MM-DD' ), TO_DATE( '2012-03-02', 'YYYY-MM-DD' ), TO_DATE( '2010-04-02', 'YYYY-MM-DD' ), 99, 1 FROM DUAL
UNION ALL SELECT 'B1', 'AM', 'T', TO_DATE( '2014-05-02', 'YYYY-MM-DD' ), TO_DATE( '2012-03-05', 'YYYY-MM-DD' ), TO_DATE( '2010-04-02', 'YYYY-MM-DD' ), 99, 1 FROM DUAL
UNION ALL SELECT 'p1', '4',  'X', TO_DATE( '2014-05-08', 'YYYY-MM-DD' ), TO_DATE( '2012-03-04', 'YYYY-MM-DD' ), TO_DATE( '2015-05-09', 'YYYY-MM-DD' ), 22, 2 FROM DUAL
UNION ALL SELECT 'p2', '3',  'Y', TO_DATE( '2015-08-01', 'YYYY-MM-DD' ), TO_DATE( '2011-05-06', 'YYYY-MM-DD' ), TO_DATE( '2010-07-08', 'YYYY-MM-DD' ), 20, 3 FROM DUAL;
SELECT *
FROM   TEST t
WHERE  EXISTS (
         SELECT 'X'
         FROM   TEST x
         WHERE  x.ROWID  <> t.ROWID
         AND    x.ANo    = t.Ano
         AND    x.Code   = t.Code
         AND    x."Type" = t."Type"
         AND    x.cps    = t.cps
         AND    x.tax    = t.tax
         AND    x.EX_DATE BETWEEN t.EX_DATE - INTERVAL '10' DAY AND t.EX_DATE + INTERVAL '10' DAY
         AND    x.RD_DATE BETWEEN t.RD_DATE - INTERVAL '10' DAY AND t.RD_DATE + INTERVAL '10' DAY
       )
| ANO | CODE | Type |                   DATE1 |                 EX_DATE |                 RD_DATE | CPS | TAX |
|-----|------|------|-------------------------|-------------------------|-------------------------|-----|-----|
|  B1 |   AM |    T |   May, 02 2014 00:00:00 | March, 05 2012 00:00:00 | April, 02 2010 00:00:00 |  99 |   1 |
|  B1 |   AM |    T | April, 01 2014 00:00:00 | March, 02 2012 00:00:00 | April, 02 2010 00:00:00 |  99 |   1 |

和。您想让查询显示重复项吗?这两个答案在Oracle中都可以正常工作,但在SQL server 2008中不可用。我需要对这些日期字段进行任何示例修改吗?这将匹配每一行(并将实际匹配的行复制到其他行)。@Dmitry-很高兴看到这一点:。我对此一无所知。我可以在这里创建多个模式,并根据需要连接不同的表。如果是,如何进行?我没有对产品的写访问权,所以我想在这里尝试一些东西。在sqlfinder idk中,但在db中,如果用户对这两个方案都有授权,那么是的。同样的方式,“abs”在SQL Server中不起作用。如何在SQLServer2008中执行相同的操作。我试过datediff函数,但它不起作用。有什么帮助吗?谢谢你的回答。我试试看。请注意,ANO、代码、类型、CPS、税务来自一个表,日期1、出厂日期、出厂日期来自另一个表。此外,如果我有4个日期为4、5、6和16的记录;那么4,5,6将被视为重复,16也将被视为重复,因为当比较6和16时,差值将为10,根据条件,小于等于10的日期是重复的;因此,所有日期4、5、6、16都是重复记录。