空日期性​​能

时间:2019-06-03 19:58:20

标签: sql oracle performance

我正在寻找相同的行,并且当生日日期字段为<script> //created a variable for instructions var instructions = '<h1><center>You will see three different symbols appear</center></h1>'; //Created a button var button = document.createElement('button'); button.innerHTML = 'Click here to Start'; var body = document.getElementsByTagName('body')[0]; body.appendChild(button); button.addEventListener('click', function(){ if('click'){ document.open(newPage) } }); //Pressing a key (space bar in this case) will open up a blank page with the instructions of the experiment document.addEventListener('keydown',function(e){ if(e.keyCode==32){ document.location.href=('about:blank'); document.write(instructions) } }); </script> 时遇到问题。

我目前有两个脚本,它们可以识别我正在寻找的三种相同性,但是我想用一种来实现。

是的,可以将数据更新为使用一个已知的日期,这可能意味着空值,但是我不想更改数据或将其复制到新表中。

我确实设法创建了一个脚本来完成所有工作,但是运行起来需要花费大量时间。多亏了answer,我才能够做到这一点。这两个脚本的运行时间均不到一秒钟,而单个脚本则需要26分钟。

与空生日匹配的脚本1,但缺少相同的名字

null

脚本2缺少空生日

SELECT last_name, birthdate, count(distinct first_name) 
FROM merged_person 
    having count(distinct first_name) >1 
GROUP BY last_name, birthdate 
ORDER BY last_name;

可以找到所有结果但花费太长时间的脚本3变体。
变体1

SELECT *
FROM merged_person
WHERE (last_name, birthdate) IN
    (SELECT last_name, birthdate
    FROM merged_person
    GROUP BY last_name, birthdate
    HAVING COUNT(*) > 1
    )
ORDER BY last_name, birthdate;

变体2

SELECT *
FROM merged_person
WHERE (last_name, nvl(birthdate, '0001-01-01')) IN
    (SELECT last_name, nvl(birthdate, '0001-01-01')
    FROM merged_person
    GROUP BY last_name, birthdate
    HAVING COUNT(*) > 1
    )
ORDER BY last_name, birthdate;

使用SELECT * FROM merged_person WHERE (last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000')) IN (SELECT last_name, nvl(to_char(birthdate, 'DD-MM-YYYY'), '00-00-0000') FROM merged_person GROUP BY last_name, birthdate HAVING COUNT(*) > 1 ) ORDER BY last_name, birthdate; 无法捕获所有案件。

有没有一种方法可以提高性能,或者有另一种方法来使空生日匹配?

编辑:

相同性是具有相同的姓氏和生日的记录,其余字段对于匹配而言并不重要,但它们是名字,文件号,员工ID,性别,一堆雇用信息。

在处理生产数据时,无法显示任何返回的行。

示例

  • Bruce Banner,生于1966年,Empid 1234,男
  • 萨拉·班纳(Sarah Banner),生于1966年,Empid 1345,女
  • 安妮·赖斯(Anne Rice),无,Empid 1134,女
  • 本·赖斯(Ben Rice),空,Empid 1153,男性

识别横幅广告很容易。造成问题的是赖斯。

2 个答案:

答案 0 :(得分:2)

解析函数可以避免自联接和类型转换的问题:

-姓氏和出生日期相同的人。 选择名字,姓氏,生日 从 (

--All rows, with a count of people with same last name and birth date.
select first_name, last_name, birthdate,
    count(*) over (partition by last_name, birthdate) duplicate_count
from merged_person

) 其中重复计数> = 2 按名字,姓氏,生日排序;


最初的问题始于经典的NULL问题:NULL不等于NULL,但是NULL也不等于NULL。这很令人困惑,需要花一些时间来理解,但是如果您将NULL视为“缺少值”,这确实是有道理的。

使用NVL来避免NULL问题是一个好主意,但是隐式类型转换可能会引起问题。使用ISO 8601日期文字会更干净。您已经使用了正确的格式,只需将关键字DATE放在其前面即可。

更改:

nvl(birthdate, '0001-01-01')

收件人:

nvl(birthdate, date '0001-01-01')

答案 1 :(得分:0)

  1. 如果要检索姓氏和生日相同的行,则从查询中排除“生日”列中为NULL的行。
  2. 如果此表很大,那么我建议不要使用IS NULL或IS NOT NULL运算符。但是,如果您有带有Y / N的标志(是否存在DOB),则可以使用此标志过滤掉没有出生日期的记录。
  3. 但是IS NULL或IS NOT NULL是在您的情况下选择行的唯一方法。在SELECT子句中使用行级函数会产生一些开销,但不会像在WHERE子句的LHS中使用它们时那样大,并且为此需要使用IS NULL和IS NOT NULL。
  4. 此外,我在您的SQL语句中看不到WHERE子句。这个桌子多大? SELECT列是否在某些索引中作为前导列属于索引的一部分?