Что такое быстрый способ объединения двух таблиц и использования первого столбца таблицы для «фильтрации» второй таблицы? - PullRequest
0 голосов
/ 27 августа 2010

Я пытаюсь разработать запрос SQL Server 2005, но в данный момент у меня ничего не получается. Я пробовал все известные мне разные подходы, например производные таблицы, подзапросы, CTE и т. Д., Но я не смог решить проблему. Я не буду публиковать запросы, которые попробовал здесь, потому что они включают много других столбцов и таблиц, но я попытаюсь объяснить проблему на более простом примере:

  • Существует две таблицы: PARTS_SOLD и PARTS_PURCHASED. Первый содержит продукты, которые были проданы покупателям, а второй содержит продукты, которые были приобретены у поставщиков. Обе таблицы содержат внешний ключ, связанный с самим движением, который содержит даты и т. Д.

  • Вот упрощенная схема:

Таблица PARTS_SOLD:

  • part_id
  • date
  • другие столбцы

Таблица PARTS_PURCHASED

  • part_id
  • date
  • другие столбцы

  • Мне нужно объединить каждую строку в PARTS_SOLD с уникальной строкой из PARTS_PURCHASED, выбранной с помощью part_id и максимальным значением date, где "date" равно перед столбцом "date" от PARTS_PURCHASED. Другими словами, мне нужно собирать информацию о последнем событии покупки этого предмета для каждого случая продажи этого предмета.

Сама проблема в том, что я не нашел способа соединить таблицу PARTS_PURCHASED с таблицей PARTS_SOLD, используя столбец "date" из PARTS_SOLD, чтобы ограничить MAX(date) PARTS_PURCHASED таблица.

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

Ответы [ 3 ]

3 голосов
/ 27 августа 2010

Тебе не понравится мой ответ.Ваша база данных спроектирована неправильно, поэтому вы не можете вернуть данные так, как вы хотите.Даже используя курсор, вы не получили бы хороших данных от этого.Предположим, что вы приобрели 5 из части 1 31 мая 2010 года. Предположим, что 1 июня вы продали десять из части 1. Если сопоставить только на дату, вы сопоставите все десять с покупкой 31 мая, хотя это явно не правильно, некоторыедетали могут быть приобретены 23 мая, а некоторые могут быть куплены 19 июля 2008 года.

Если вы хотите знать, какая купленная деталь относится к какой продаваемой детали, ваш дизайн базы данных должен включать PartPurchasedID как частьзапись PartsSold, и она должна быть заполнена во время покупки, а не позднее, чтобы сообщить, когда у вас есть 1 000 000 записей для сортировки.

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

Возможно, поможет следующее:

SELECT S.*
  FROM PARTS_SOLD S
INNER JOIN (SELECT PART_ID, MAX(DATE)
              FROM PARTS_PURCHASED
              GROUP BY PART_ID) D
  ON (D.PART_ID = S.PART_ID)
WHERE D.DATE <= S.DATE

Делись и наслаждайся.

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

Я брошу это туда, но, скорее всего, оно содержит всевозможные ошибки ... и потому, что я не уверен, что понимаю ваш вопрос, и потому, что мой SQL ... в лучшем случае слаб. При этом, моя мысль будет попробовать что-то вроде:

SELECT * FROM PARTS_SOLD
INNER JOIN (SELECT part_id, max(date) AS max_date 
            FROM PARTS_PURCHASED 
            GROUP BY part_id) AS subtable
   ON PARTS_SOLD.part_id = subtable.part_id
      AND PARTS_SOLD.date < subtable.max_date
...