Плохие результаты из-за левых соединений

0

Я пытаюсь получить все свое сообщение, где Vote IPAddress не соответствует моей собственной. Вот мой SQL. Проблема в том, что я получаю сообщение, за которое я голосовал, когда кто-то еще голосовал за него. Я думал, что этот код говорит о выборе должности, когда возможно объединение слева, и нет IPAddr, который == мой. Но похоже, что это не происходит. Как написать это?

select * from Post 
left join Vote as V on V.post=Post.id AND V.IPAddr<>123
where flag='1';

Вот некоторые фиктивные данные, чтобы проиллюстрировать проблему.

create table P(id int primary key, body text);
create table V(id int primary key, val int, ip int, post int);
insert into P values(1,"aaa");
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
insert into V values(1, 2,123,1);
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
insert into V values(2, 2,13,1);
select * from P left join V on V.post=P.id where (V.ip is null or V.ip<>123);
Теги:
left-join

3 ответа

4
Лучший ответ
select * 
from Post p 
left join Vote as V on V.post=p.id 
where (V.IPAddr is null or V.IPAddr<>123) 
    and flag='1'; 

Update:

select * 
from P 
left outer join V on V.post=P.id 
where not exists (
    select 1 from v
    where IP = 123
    and post = p.id
)
  • 0
    Вот на самом деле, как я оригинально написал код. Это не сработало, так что переписать в вопросе выше.
  • 0
    Не думайте, что я смогу сделать больше, не увидев данных и примеров.
Показать ещё 5 комментариев
3

Это то, что вам нужно?

SELECT * FROM P 
WHERE NOT EXISTS
     (SELECT * FROM V 
      WHERE V.post=P.id AND V.ip=123)
  • 0
    ааа подзапрос. Я надеялся, что смогу обойтись без. Я думаю, что это может быть мой единственный подзапрос в проекте. Да, это правильно. Принято другое, потому что он помог перед редактированием.
0

Возможно, что-то вроде...

SELECT *
    FROM P
    WHERE EXISTS (SELECT *
                      FROM V
                      WHERE V.IP IS NOT NULL AND
                            V.IP <> 123      AND
                            P.ID = V.POST);

- это то, что вы ищете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню