Объединение MSSQL Все два запроса с оператором if

У меня есть запрос, который работает так, как ожидалось.

 If((Select count(*) from table1 where product = 'carrot')< 5)
Begin
Select Top (5 - (Select count(*) from table1 where product = 'carrot'))
id, product From table2
WHere id NOT IN
(Select id from table1) AND product = 'carrot'
Order by newid()
END

То, что я хочу сделать, это Союз или Союз, все говорят, что картофель другого продукта

If((Select count(*) from table1 where product = 'potato')< 5)
Begin
Select Top (5 - (Select count(*) from table1 where product = 'potato'))
id, product From table2
WHere id NOT IN
(Select id from table1) AND product = 'potato'
Order by newid()
END

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

Что я делаю, так это пытаюсь выбрать случайный образец моркови, сначала я хочу проверить, есть ли у меня 5 морковей в таблице 1. если я не запускаю образец. Если у меня нет 5 морковок, запустите пробоотборник и верните 5 морковок. Затем я отфильтровываю, если они уже существуют в таблице 1 по идентификатору. Затем он вычитает количество из нового образца, итого получается пять.

Это работает хорошо, теперь я хочу работать с другими продуктами, например, салатом, картофелем и т. Д. Но я хочу СОЮЗ или СОЮЗ Все. надежда имеет смысл.


person El Not to Worry    schedule 23.08.2019    source источник
comment
Это недопустимый синтаксис: Select Top (5 - (Select count(*) from #Table1 where product = 'carrots')< 5). Я полагаю, вы не хотите, чтобы там была эта ‹5?   -  person Brian Pressler    schedule 24.08.2019
comment
Кроме того, если вы выберете идентификаторы из таблицы 2, где идентификатор не находится ни в одном из идентификаторов в таблице 2... он никогда не вернет никаких записей. Что вы пытаетесь достичь?   -  person Brian Pressler    schedule 24.08.2019
comment
я отредактировал вопрос надеюсь имеет смысл   -  person El Not to Worry    schedule 24.08.2019


Ответы (3)


Мне было бы интересно посмотреть, работает ли этот способ -

Select Top (5 - (Select count(*) from table1 where product = 'carrots')< 5)
id
, product 
From table2
WHere id NOT IN (Select id from table2)
    AND (Select count(*) from table1 where product = 'carrots')< 5)
UNION ALL
Select Top (5 - (Select count(*) from table1 where product = 'potatoes')< 5)
id
, product 
From table2
WHere id NOT IN (Select id from table2) 
    AND (Select count(*) from table1 where product = 'potatoes')< 5)

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

person OwlsSleeping    schedule 23.08.2019
comment
Если продукт имеет более 5 строк в таблице1, он выдаст ошибку: A TOP N or FETCH rowcount value may not be negative. - person Brian Pressler; 04.09.2019

Вы можете попробовать это так

If(((Select count(*) from table1 where product = 'carrot'< 5) and (Select count(*) from table1 where product ='potato' <5))
) 
Begin

Select Top (5 - (Select count(*) from table1 where product = 'carrot')) id, product 
From table2 
WHere id NOT IN (Select id from table1) AND product = 'carrot' Order by newid()

Union all


Select Top (5 - (Select count(*) from table1 where product = 'potato')) id, product From table2 
WHere id NOT IN (Select id from table1) AND product = 'potato' Order by newid()

END
person sridhar7    schedule 24.08.2019
comment
Это вернет строки только в том случае, если для каждого продукта имеется менее 5 записей. Если у одного продукта больше 5, а у другого меньше... операторы выбора вообще не будут выполняться. - person Brian Pressler; 04.09.2019

Операторы IF в SQL не ведут себя как подзапросы или наборы строк в SQL, как вы уже выяснили. Они предназначены только для разветвления потока управления.

Вот более подход, основанный на наборах, который вы могли бы использовать:

SELECT ProdSamples.*
FROM
    (
    SELECT Table2.*, ROW_NUMBER() OVER (PARTITION BY table2.Product ORDER BY NEWID()) RowNum
    FROM Table2
    LEFT JOIN Table1
    ON Table1.id = Table2.id
    WHERE Table1.id IS NULL
    ) ProdSamples
JOIN
    (
    SELECT Product, COUNT(*) ProdCount
    FROM Table1
    GROUP BY Product
    ) ProdCounts
ON ProdSamples.Product = ProdCounts.Product
    AND ProdSamples.RowNum <= (5 - ProdCounts.ProdCount)

Первый подзапрос ProdSamples возвращает все продукты из Table2, у которых нет id в Table1. Поле RowNum ранжирует их в случайном порядке, разделенном Product.

Второй подзапрос ProdCounts — это количество записей для каждого продукта в Table1. Затем он объединяет эти подзапросы вместе и возвращает только записи из ProdSamples, где RowNum меньше или равно количеству выборок, которые вы хотите вернуть.

person Brian Pressler    schedule 26.08.2019