Оптимизировать SQL-запросы, нужны предложения - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица в SQL Server, имеющая 4 столбца:

Invoice No, Date, Amt and ID

Мне нужно найти счета, которые имеют одинаковые номер счета, дату и сумму, но разные ID. Я заполняю результаты самообъединением, но похоже, что это не оптимизированный способ получения результатов.

Мой запрос:

select * from table t1 join 
table t2 on t1.invoice = t2.invoice 
where t1.invoice=t2.invoice and t1.amount=t2.amount and t1.date =t2.date and t1.id!=t2.id

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

Ответы [ 4 ]

0 голосов
/ 04 ноября 2019

необходимо найти счета, которые имеют одинаковые номер счета, дату и сумму, но разные ID.

Использование exists:

select t.*
from t
where exists (select 1
              from t t2
              where t2.Invoice = t.invoice and
                    t2.Date = t.date and
                    t2.amount = t.amount and
                    t2.id <> t.id
             )
order by t.invoiceNo, t.date, t.amount, t.id;

Это покажетсопоставление накладных на соседних строках. Для производительности вам нужен индекс на (invoice, date, amount, id).

Если вы просто хотите, чтобы там происходили триплеты, вы можете использовать агрегацию:

select invoice, date, amount, min(id), max(id)
from t
group by invoice, date, amount
having count(distinct id) > 1;

Примечание: Если имеется более двух дубликатов, это показывает только два идентификатора.

0 голосов
/ 04 ноября 2019

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

Я посоветовал использовать подзапрос в качестве новой таблицы для использования объединений. так же, как первый ответ.

0 голосов
/ 04 ноября 2019

использование не существует

select t1.* from table t1 
where not exists( select 1 form 
table t2 where t1.invoice = t2.invoice 
and t1.invoice=t2.invoice and t1.amount=t2.amount 
and t1.date =t2.date and   t1.id=t2.id
having count(*)>1
)
0 голосов
/ 04 ноября 2019

попробуйте это. используя левое соединение и фильтруйте эти нули.

select * from (
    select t1.invoiceno, t1.date, t1.amt, t1.id, t2.id as t2ID
    from invoices t1
    left join invoices t2 on t2.invoiceno = t1.invoiceno 
        and t2.date = t1.date 
        and t2.amt = t1.amt
        and t2.id != t1.id) t3 
where coalesce(t3.t2ID, 0) != 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...