选择确切的记录

时间:2016-07-07 18:36:18

标签: sql oracle join duplicates inner-join

INSERT INTO filerecord (fname,
                                  lname,
                                  transdate,
                                  memberid)
 VALUES ('tyler',
         'smith',
         TO_DATE ('07/01/2016', 'mm/dd/yyyy'),
         '111');

我得到以下结果:

fname      lname              email
fernando    hernandez   fh@yahoo.com
fernando    hernandez   ts@hotmail.com

IT不应该显示Tyler Smith的姓名&由于transdate条款而发送的电子邮件。我正在寻找一个能让我得到费尔南多结果的人。 我无法改变表格的结构。

3 个答案:

答案 0 :(得分:0)

不是。我刚刚创建了一个新表并进行了检查。

表成员

create table member (programid varchar(10), memberid int, fname varchar(10), lname varchar(10), email varchar(25))

内容

+-----------+----------+----------+-----------+----------------+
| PROGRAMID | MEMBERID |  FNAME   |   LNAME   |     EMAIL      |
+-----------+----------+----------+-----------+----------------+
| BLUE      |      111 | tyler    | smith     | ts@hotmail.com |
| GREEN     |      111 | fernando | hernandez | fh@yahoo.com   |
+-----------+----------+----------+-----------+----------------+

表格文件记录

create table filerecord (fname varchar(10), lname varchar(10), transdate date, memberid int);

内容

+-------+-------+-----------+----------+
| FNAME | LNAME | TRANSDATE | MEMBERID |
+-------+-------+-----------+----------+
| tyler | smith | 7/1/2016  |      111 |
+-------+-------+-----------+----------+

上次查询

SELECT b.fname, b.lname, e.email
     FROM filerecord b, member e
     WHERE     b.memberid IN ('111')
     AND b.memberid = e.memberid
     AND b.transdate >= TO_DATE ('07/02/2016', 'mm/dd/yyyy');

结果 -

未选择任何行。

答案 1 :(得分:0)

您正在购买笛卡尔积。

您有两个条目memberid =' 111'在两个表中,所以这个条件

 AND b.memberid = e.memberid

将您过滤到4行 -

  • 一个与Tyler Smith一起加入Tyler Smith的电子邮件
  • 与费尔南多·埃尔南德斯一起加入费尔南多·埃尔南德斯的电子邮件,
  • 一个与Tyler Smith一起加入Fernando Hernandez的电子邮件和
  • 与Fernando Hernandez一起加入Tyler Smith的电子邮件

然后,这个条件:

AND b.transdate >= TO_DATE ('07/02/2016', 'mm/dd/yyyy');

排除其中两个而不是其他两个。

您需要更好的数据模型和/或更精确的方式来加入两个表。

通常,只要您连接两个表,其中一个表应指定其所有主键列以避免此类错误。 (有一些例外情况,一如既往)。

答案 2 :(得分:0)

由于memberid不是唯一标识符,因此没有理由从b.memberid = e.memberid这样的连接条件中获得好处。

相反,您似乎建议(或相信)(memberid, fname, lname)应该是唯一标识符。因此,在连接条件中使用它:

... WHERE ...   AND b.memberid = e.memberid 
                AND b.fname    = e.fname 
                AND b.lname    = e.lname 
          ...

像这样:

SQL> SELECT b.fname, b.lname, e.email
  2       FROM filerecord b, member e
  3       WHERE     b.memberid IN ('111')
  4       AND b.memberid = e.memberid
  5       AND b.fname    = e.fname
  6       AND b.lname    = e.lname
  7       AND b.transdate >= TO_DATE ('07/02/2016', 'mm/dd/yyyy');

FNAME                LNAME                EMAIL
-------------------- -------------------- --------------------
fernando             hernandez            fh@yahoo.com

1 row selected.