Oracle 获取多行值相等的记录sql server
我有如下SQL模式: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
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都是重复记录。