Как вернуть только строки, которые являются внутренними соединениями более одного раза - PullRequest
0 голосов
/ 27 августа 2009

У меня есть две таблицы, одна для счетов и одна для входящих платежей. Входящий платеж можно присоединить к накладной с помощью внешнего ключа, например:

from invoices t1 inner join incoming_payments t2 on t1.receiptnum = t2.docnum

Вопрос. Я хочу вернуть все счета-фактуры, на которых размещено более одного платежа. Для каждого счета я хочу вернуть его документ, который является просто уникальным идентификатором для счета.

Вот некоторые вещи, которые я пробовал, но они не работали:

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum
having count(t0.docnum) > 1  

и

select t0.docnum
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
group by t0.receiptnum, t0.docnum
having count(t0.receiptnum) > 1

Есть идеи?

Ответы [ 5 ]

1 голос
/ 27 августа 2009
select t0.docnum, count(*)
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum
having count(*) > 1

1 голос
/ 27 августа 2009

Какую ошибку SQL вы получаете? Вы группировали по всем полям, которые должны были быть сгруппированы?

1 голос
/ 27 августа 2009

Я не уверен, почему первый не сработал ... Это действительно должно было. Можете ли вы расширить на "это не сработало"?

Попытка:

select t0.docnum, *
from invoices t0 
  inner join incoming_payments t1 on t0.receiptnum = t1.docentry 

И

select t0.docnum, count(*)
from invoices t0 
  inner join incoming_payments t1 on t0.receiptnum = t1.docentry 
group by t0.docnum

чтобы помочь вам понять, что происходит.

Rob

0 голосов
/ 18 сентября 2010

Ответ оказался намного сложнее, учитывая схему, с которой я работал. Я не включил здесь фактический код, но я решил проблему некоторое время назад. Просто хотел последовать и поблагодарить всех за помощь.

0 голосов
/ 27 августа 2009

Я думаю, что ваш пример SQL несовместим (по сравнению с первым предоставленным вами SQL).
то есть в 1-м SQL вы используете docnum для сравнения, а в последующем SQL вы используете docentry.

select t0.docnum, count(t1.*)
from invoices t0 inner join incoming_payments t1 on t0.receiptnum = t1.docentry
group by t0.docnum
having count(t1.*) > 1

РЕДАКТИРОВАТЬ: Что такое поле для сравнения?
t0.receiptnum = t1.docnum ИЛИ t0.receiptnum = t1.docentry?

EDIT2: см. Выше измененный SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...