SQL-запрос для разрешения NULL для столбца самый высокий_бид, когда еще не было сделано предложение - PullRequest
0 голосов
/ 07 июня 2018

Для школы мне нужно сделать функцию на сайте аукциона.Для этого мне нужно объединить несколько таблиц в виде.Это работало очень хорошо, пока мне не нужно было добавить фильтр для ценового диапазона.Кажется достаточно простым, но результат запроса должен иметь значение NULL, если ставка не была сделана.

Заявление для представления:

SELECT I.itemID, I.title, I.startPrice, B.highestBid, Cfi.category, I.endDate
FROM dbo.Items AS I INNER JOIN dbo.category_for_item AS Cfi ON V.itemID = Vir.itemID 
LEFT OUTER JOIN dbo.Bid AS B ON V.itemID = B.itemID

Это приведет к следующей таблице:

    itemID  title   startPrice  highestBid  category    endDate
1   1234    Alfa    25          26          PC          2018-09-22
2   1234    Alfa    25          NULL        PC          2018-09-22
3   5678    Bravo   9           20          Console     2018-07-03
4   5678    Bravo   9           15          Console     2018-07-03
5   5678    Bravo   9           NULL        Console     2018-07-03
6   9876    Charlie 84          100         Stamps      2018-06-14
7   9876    Charlie 84          90          Stamps      2018-06-14
8   9876    Charlie 84          85          Stamps      2018-06-14
9   9876    Charlie 84          NULL        Stamps      2018-06-14
10  1470    Delta   98          100         Fashion     2018-06-15
11  1470    Delta   98          99          Fashion     2018-06-15
12  1470    Delta   98          NULL        Fashion     2018-06-15
13  9631    Echo    56          65          Cars        2018-06-25
14  9631    Echo    56          NULL        Cars        2018-06-25
15  7856    Foxtrot 98          NULL        Dolls       2018-12-26

После поиска ответов я получил запрос на присоединение VIEW к самому себе с отображением только самой высокой ставки вместо всех ставок:

SELECT VW.itemID, VW.title, VW.startPrice, VW.highestBid, VW.category, VW.endDate
FROM VW_SEARCH AS VW
   INNER JOIN (SELECT itemID, MAX(highestBid) AS MaxBid
                    FROM VW_SEARCH
                    GROUP BY itemID) VJ
        ON VW.itemID = VJ.itemID AND VW.highestBid = VJ.MaxBid

Это дало следующие результаты:

    itemID  title   startPrice  highestBid  category    endDate
1   1234    Alfa    25          26          PC          2018-09-22
2   5678    Bravo   9           20          Console     2018-07-03
3   9876    Charlie 84          85          Stamps      2018-06-14
4   1470    Delta   98          100         Fashion     2018-06-15
5   9631    Echo    56          65          Cars        2018-06-25

Как я и ожидал, в результате были показаны только предметы с хотя бы одной ставкой.Я попытался добавить одно дополнительное условие в subQuery и присоединиться к RIGHT OUTER, чтобы убедиться, что я не получу двойные значения itemID.

SELECT VW.itemID, VW.title, VW.startPrice, VW.highestBid, VW.category, VW.endDate
FROM VW_SEARCH AS VW
   RIGHT OUTER JOIN (SELECT itemID, MAX(highestBid) AS MaxBid
                    FROM VW_SEARCH
                    WHERE highestBid > 0 OR highestBid IS NULL
                    GROUP BY itemID) VJ
        ON VW.itemID = VJ.itemID AND VW.highestBid = VJ.MaxBid

Это дало следующие результаты (не добавило результат 5 - 1199, потому что этовсе то же самое, что и результат 4, это будет происходить в реальной таблице, а не в примере из приведенного выше примера):

         itemID title   startPrice  highestBid  category    endDate
1       1234    Alfa    25          26          PC          2018-09-22
2       5678    Bravo   9           20          Console     2018-07-03
3       9876    Charlie 84          85          Stamps      2018-06-14
4       NULL    NULL    NULL        NULL        NULL        NULL
1200    1470    Delta   98          100         Fashion     2018-06-15
1201    9631    Echo    56          65          Cars        2018-06-25

Хотя это технически разрешает NULL в столбцах, мне нужно получить результат в лайкахиз:

    itemID  title   startPrice  highestBid  catgory endDate
1   1234    Alfa    25          26          PC          2018-09-22
2   5678    Bravo   9           20          Console     2018-07-03
3   9876    Charlie 84          85          Stamps      2018-06-14
4   1470    Delta   98          100         Fashion     2018-06-15
5   9631    Echo    56          65          Cars        2018-06-25
6   7856    Foxtrot 98          NULL        Dolls       2018-12-26

Как получить желаемый результат, или это просто невозможно?Также, если запрос может быть написан лучше, скажите, пожалуйста.Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Решите проблему, используя left join:

SELECT VW.itemID, VW.title, VW.startPrice, VW.highestBid, VW.category, VW.endDate
FROM VW_SEARCH VW LEFT JOIN
     (SELECT itemID, MAX(highestBid) AS MaxBid
      FROM VW_SEARCH
      GROUP BY itemID
     ) VJ
     ON VW.itemID = VJ.itemID AND VW.highestBid = VJ.MaxBid;

Или используйте стандартную ANSI функцию ROW_NUMBER():

select vw.*
from (select vw.*,
             row_number() over (partition by itemID
                                order by highestBid nulls last
                               ) as seqnum
      from vw_search vw
     ) vw
where seqnum = 1;

Это гарантирует одну строку на элемент.

Примечание. Не все базы данных поддерживают NULLS LAST.Это может даже не быть необходимым, но вы также можете реализовать это с помощью выражения case.

0 голосов
/ 07 июня 2018

Я бы пошел только с subquery, потому что идентификатор столбец:

select vw.*
from vw_search vw
where id = (select vm1.id
            from vw_search vm1
            where vm.itemID = vw1.itemID and vm1.highestBid is not null
            order by vm1.highestBid desc
            limit 1
           );

Однако некоторые DBMS не поддерживают предложение LIMIT, такое как SQL Server, если это так, тогда вы можете использовать предложение TOP.

0 голосов
/ 07 июня 2018

Можете ли вы дать определение представления хотя бы?Может быть, определение таблицы тоже.

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