2015-04-30 2 views
0

Я пытаюсь сопоставить имена в DS с идентификаторами в A, и их можно подключить только через DA, который является в основном идентификатором клиента и идентификатором элемента. Мне также нужно показать элемент, который не имеет записи о покупке.SQL Oracle повторяет результаты при использовании OR

Я попытался использовать оба условия отдельно, Часть А

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, прежде чем я закончу d это. Я знаю, что могу избавиться от них, используя DISTINCT, но я хочу знать причину этого и как вообще избежать такого рода вещей.

ответ

0

Попробуйте использовать join и left 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 

Это должно дать вам правильный результат.

В вашем запросе вы получаете перекрестное произведение всех записей.

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 
С уважением.

Смежные вопросы