使用OR时,SQL Oracle重复结果

时间:2015-04-30 05:11:34

标签: sql oracle

我尝试将DS中的名称与A中的ID匹配,并且只能通过DA连接,这基本上是客户ID和项ID。我还需要显示没有购买记录的项目。

我试过单独使用这两个条件, A部分

SELECT DS.name,A.id
FROM DS,
A,
DA
WHERE DS.id=DA.id AND 
A.id=DA.id;

B部分

SELECT name
FROM DS,
WHERE DS.id NOT IN (
SELECT id FROM DA);

然后当我使用以下代码时

SELECT DS.name,A.id
FROM DS,
A,
DA
WHERE (DS.id=DA.id AND 
A.id=DA.id) OR 
DS.id NOT IN (
SELECT id FROM DA);

A部分返回4077个结果,B部分返回820,但最终代码在我终止之前给了我140000。 我知道我可以通过使用DISTINCT摆脱它们但我想知道这个的原因以及如何实际避免这种事情的发生。

2 个答案:

答案 0 :(得分:0)

尝试使用joinleft outer join

SELECT DS.name,A.id
FROM DA join 
A on A.id=DA.id
left outer join DA on DS.id=DA.id

这应该会给你正确的结果。

在您的查询中,您将获得所有记录的交叉产品。

答案 1 :(得分:0)

请尝试此查询

    select TABA.DS_NAME,TABA.A_ID
    from 
    (SELECT DS.name as Ds_Name,A.id as A_ID
    FROM DS,
    A,
    DA
    WHERE DS.id=DA.id AND 
    A.id=DA.id)as TABA join 
    (SELECT name,id
    FROM DS,
    WHERE DS.id NOT IN(
    SELECT id FROM DA))as TABB
    on TABA.A_ID = TABB.id
    
问候。