Хранимая процедура SQL Server: как найти записи, которые содержат как минимум те же данные в другой таблице, что и входные данные - PullRequest
0 голосов
/ 23 декабря 2019

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

  • Bars (BarID, Name)
  • Drinks (DrinkID, Name, TypeID)
  • Продажи (BarID, DrinkID, Цена)

Моя проблема в том, что мне нужно написать процедуру, которая выбирает ВСЕ столбцы, которые содержат как минимум те же напитки, что и столбец, введенный в процедуру с переменной (например, @barname).

Например, если в баре А продаются виски и кокс, мне нужно выбрать все бары, в которых продается хотя бы виски и кокс.

Это моя очень сложная попыткас курсором, но я понятия не имею, если мне даже нужно использовать курсор с ним. Я действительно потерян.

ALTER PROCEDURE similar 
    (@barname AS VARCHAR(30))
AS 
BEGIN
    SET NOCOUNT ON

    DECLARE @db AS INT

    SELECT @db = COUNT(*)
    FROM Sells
    WHERE BarID = (SELECT BarID FROM Bars WHERE Bars.Name = @barname)

    SELECT BarID INTO #BarMinDb
    FROM Sells
    WHERE BarID != (SELECT BarID FROM Bars WHERE Bars.Name = @barname)
    GROUP BY BarID
    HAVING COUNT(DrinkID) >= @db

    DECLARE @rn AS INT

    DECLARE kurzor CURSOR FOR 
         SELECT BarID FROM #barMinDb

    OPEN kurzor

    FETCH NEXT FROM kurzor INTO @rn

    WHILE @@FETCH_STATUS = 0
        IF (SELECT DrinkID
            FROM Sells
            WHERE BarID = @rn) IN (SELECT DrinkID 
                                   FROM Sells
                                   WHERE BarID = (SELECT Name FROM Bars 
                                                  WHERE Bars.Name = @barname)
            )
        BEGIN
            PRINT @rn
        END

        FETCH NEXT FROM kurzor INTO @rn

    CLOSE kurzor
    DEALLOCATE kurzor
END

Кроме того, меня просят выбрать их, поэтому я думаю, что мне нужно использовать SELECT, а не печатать их вручную.

1 Ответ

0 голосов
/ 23 декабря 2019

Это то, что у меня так далеко.

DECLARE @DrinksCount AS INT, @barname AS VARCHAR(30)

set @barname = "QBar";

    -- All drinks of bar @barname
select @DrinksCount = count(s.DrinkID)  from Bars b 
inner join Sells s on b.BarID = s.BarID 
where b.name = @barname

-- All bars offering at least the same drinks
select b.name, count(s.DrinkID) from Bars b 
inner join Sells s on b.BarID = s.BarIDv
inner join
(
-- All drinks of bar @barname
select s.DrinkID  from Bars b 
inner join Sells s on b.BarID = s.BarID 
where b.name = @barname
) a 
on a.DrinkID  = s.DrinkID
having count() = @DrinksCount
group by b.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...