自连接Oracle
我有一个表,下面的表1是数据的样子 Column1是另一个表的外键自连接Oracle,oracle,self-join,Oracle,Self Join,我有一个表,下面的表1是数据的样子 Column1是另一个表的外键 Column1 Column2 Column3 1 A 06/MAY/14 1 A 05/MAY/14 1 B 06/MAY/14 1 B 01/JAN/00 1 A 01/JAN/00 现在我想找到满足以下条件的不同column1值 1.至少有一条记录,其中第
Column1 Column2 Column3
1 A 06/MAY/14
1 A 05/MAY/14
1 B 06/MAY/14
1 B 01/JAN/00
1 A 01/JAN/00
现在我想找到满足以下条件的不同column1值
1.至少有一条记录,其中第2列应为A,第3列应为(sysdate-1)
及
2.至少有一条记录,其中第2列应为B,第3列应为(sysdate-1)
这意味着至少一个A和B的第3列应该填充(sysdate-1)
我写了下面的问题,请告诉我是否做错了什么
我也想知道我加入的方式是否正确。该表包含大约50K条记录,我想性能应该不错
SELECT DISTINCT COLUMN1 FROM
TABLE1 A
JOIN
TABLE1 B ON (A.COLUMN1 = B.COLUMN1)
WHERE
((TRUNC(A.COLUMN3) - TRUNC(A.COLUMN3) = 0)
AND TRUNC(A.COLUMN3) = TRUNC(SYSDATE - 1)
AND TRUNC(B.COLUMN3) = TRUNC(SYSDATE - 1)
AND A.COLUMN2 = 'A'
AND B.COLUMN2 = 'B'
AND TO_CHAR(A.COLUMN3, 'DD-MON-YY') != '01-JAN-00'
AND TO_CHAR(B.COLUMN3, 'DD-MON-YY') != '01-JAN-00'
);
这应该行得通
SELECT DISTINCT A.column1 -- Obtain distinct from A
FROM table1 A -- TableA
join table1 B -- TableB
ON A.column1 = B.column1 -- Joining them on Column1
WHERE A.column3 = SYSDATE - 1 -- Yesterdays data on Table A
AND A.column2 = 'A' -- A values
AND B.column2 = 'B'; -- B Values
注意:您的测试用例没有明显的差异。因此,请尝试使用唯一的键。要进行性能比较,请使用子选择和组:
SELECT COLUMN1 FROM (
SELECT
COLUMN1,
COUNT(COLUMN2) CNT
FROM (
SELECT DISTINCT
COLUMN1,
COLUMN2
FROM TABLE1
WHERE TRUNCATE(COLUMN3) = SYSDATE - 1 AND
(COLUMN2 = 'A' OR COLUMN2 = 'B'))
GOUP BY COLUMN1)
WHERE CNT = 2
和B.column3=SYSDATE-1不需要A.column3=SYSDATE-1
应该注意这一点<代码>A
和B
是同一张表。哦,是的。谢谢。忘了Hanks,你能告诉我为什么当包含column3的所有行都是'01/JAN/00'时,下面的语句不返回任何行吗。从表1中选择distinct column1,max(column3)over(partitionbycolumn1)作为stmt,其中(1)simple中的column1。。。2000年1月不是昨天。。你说你只需要sysdate-1(昨天),如果你不知道它是什么,不要使用max over parion。。。首先阅读手册,但在上面的查询中我没有任何where子句声明sysdate-1。其中,第条仅为第(1)款中的第1列。