Как получить одно общее значение из базы данных с помощью UNION - PullRequest
1 голос
/ 10 мая 2011

enter image description here

2 записи на изображении выше взяты из Db, в таблице выше ограничения (SID и LINE_ITEM_ID), SID и LINE_ITEM_ID оба столбца используются для поиска уникальной записи.

Мои проблемы: я ищу запрос, который должен извлечь из базы данных записанное в зависимости от условий, если я ищу PART_NUMBER = 'PAU43-IMB-P6' 1. Он должен извлечь одну запись из БД, если поиск PART_NUMBER = 'PAU43-IMB-P6 ', независимо от того, к какому SID принадлежит данный элемент, если есть только одна запись в SID = 1 или SID = 2. 2. он должен извлечь одну запись, которая находится только в SID = 2, из БД при поискеPART_NUMBER = 'PAU43-IMB-P6', если есть 2 элемента, один в SID = 1 и другой в SID = 2.

Я ищу запрос, который будет искать заданный номер_части в зависимости от обоих SID1 и 2, и он должен возвращать значение в SID = 2, и он может возвращать значение в SID = 1, только если в SID = 2 нет записей (запрос должен выдерживать нагрузку поиска записей Million).

Спасибо

Ответы [ 3 ]

0 голосов
/ 10 мая 2011

Если я правильно понимаю, для каждого рассматриваемого LINE_ITEM_ID вы хотите вернуть только тот, который имеет наибольшее значение для SID. Это общее требование, и, как и в большинстве случаев в SQL, его можно записать разными способами; наилучшая производительность будет зависеть от многих факторов, не в последнюю очередь от того, какой продукт SQL вы используете.

Вот один из возможных подходов:

SELECT DISTINCT * -- use a column list
  FROM YourTable AS T1
       INNER JOIN (
                   SELECT T2.LINE_ITEM_ID, 
                          MAX(T2.SID) AS max_SID 
                     FROM YourTable AS T2
                    GROUP
                       BY T2.LINE_ITEM_ID
                  ) AS DT1 (LINE_ITEM_ID, max_SID)
          ON T1.LINE_ITEM_ID = DT1.LINE_ITEM_ID 
             AND T1.SID = DT1.max_SID;

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

0 голосов
/ 13 мая 2011

Ну, в моем случае это сработало примерно так:

select LINE_ITEM_ID,SID,price_1,part_number from (
(select LINE_ITEM_ID,SID,price_1,part_number from Table where SID = 2)
 UNION 
(select LINE_ITEM_ID,SID,price_1,part_number from Table  SID = 1 and line_item_id NOT IN (select LINE_ITEM_ID,SID,price_1,part_number from Table  SID = 2)))

Этот запрос решил мою проблему ..........

0 голосов
/ 10 мая 2011
Select * 
  from Table
 where SID||LINE_ITEM_ID = (
                            select Max(SID)||Max(LINE_ITEM_ID) 
                              from table 
                             where PART_NUMBER = 'PAU43-IMB-P6'
                           );
...