Установите несколько переменных и оператор case в 1 запросе

У меня есть

  • таблица a со столбцами lot и tid
  • таблица b со столбцами lot и id
  • таблица t с идентификатором столбца и флагом

Одна из моих переменных набора запросов @ID для запроса ниже, чей флаг = 'Y'

2-й запрос задает переменную @ID_Not_Flag для запроса ниже, чей флаг <> 'Y'

Могу ли я выполнить следующие запросы (установить @ID и @ID_Not_Flag) в одном запросе?

SELECT @ID = a.tid          
FROM a, b, t 
WHERE b.lot = a.lot and b.id =123 and t.id = a.tid and flag = 'Y'   
SELECT @ID_Not_Flag = a.tid 
FROM a, b, t 
WHERE b.lot = a.lot and b.id =123 and t.id = a.tid and flag <> 'Y'  

Table a
lot       tid
100       1
100       2

Table b
lot       id
100       123

Table t
id        flag
1         Y
2         N

Желаемый результат от 1 запроса: @ID = 1, @ID_Not_Flag = 2

Приведенный ниже запрос приводит к @ID = 1, @ID_Not_Flag = NULL

SELECT
@ID = (CASE WHEN flag = 'Y' THEN  a.tid END),
@ID_Not_Flag = (CASE WHEN flag <> 'Y' THEN a.tid END)
FROM a, b, t 
WHERE b.lot = a.lot and b.id =123 and t.id = a.tid
SELECT @ID,@ID_Not_Flag

Результат (не правильный):

ID   ID_Not_Flag
1    NULL

Я бы предложил отделить ваши предикаты соединения от вашего предложения where

Mark Schultheiss 18.03.2022 20:02

Эволюционировать! Никто не должен использовать присоединяется к старому стилю

SMor 18.03.2022 20:15

К сведению case это выражение, а не утверждение.

Dale K 18.03.2022 22:00
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
4
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Можно попробовать сводную таблицу. Первая часть запроса — просто создание временных таблиц для хранения данных.

/*CREATE TEMP TABLES*/
DECLARE @a TABLE ( lot int, tid int)
DECLARE @b TABLE ( lot int, id int)
DECLARE @t TABLE ( id int, flag VARCHAR(1))

INSERT INTO @a (lot, tid) VALUES (100, 1) , (100, 2)
INSERT INTO @b (lot, id) VALUES (100, 123)
INSERT INTO @t (id, flag) VALUES (1, 'Y') , (2, 'N')

/*QUERY*/
SELECT      [Y] [@id] ,
            [N] [@id_not_flag]
FROM (
SELECT      a.lot, a.tid, b.id , t.flag
            --,ID = (CASE WHEN flag = 'Y' THEN  a.tid END)
            --,ID_Not_Flag = (CASE WHEN flag <> 'Y' THEN a.tid END)
FROM        @a a
LEFT JOIN   @b b
                ON a.lot = b.lot
LEFT JOIN   @t t
                ON t.id = a.tid) AS Src
PIVOT (max(Src.tid) FOR flag in ([Y] , [N])) Pvt

Вы можете просто использовать другое соединение и COALESCE Пример возвращает 1 2

DECLARE @a Table(lot INT,tid INT);
DECLARE @b Table(lot int ,id INT);
DECLARE @t Table(id INT,flag CHAR);
INSERT INTO @a(lot, tid)
values
(100, 1),
(100, 2);

INSERT INTO @b(lot, id)
values
(100, 123)

INSERT INTO @t(id, flag)
values
(1, 'Y'),
(2, 'N');

--SELECT * FROM @a;
--SELECT * FROM @b;
--SELECT * FROM @t;

DECLARE 
    @ID INT,
    @ID_Not_Flag INT;

SELECT
    @ID = COALESCE(ty.id,@ID),
    @ID_Not_Flag = COALESCE(tn.id, @ID_Not_Flag )
FROM @b AS b
INNER JOIN @a AS a ON b.lot = a.lot 
LEFT OUTER JOIN @t AS ty ON ty.id = a.tid AND ty.flag = 'Y'
LEFT OUTER JOIN @t AS tn ON tn.id = a.tid AND tn.flag = 'N'
WHERE b.id = 123;
SELECT @ID , @ID_Not_Flag ;

Другие вопросы по теме