在 1 个查询中设置多个变量和 case 语句
Set multiple variables and case statement in 1 query
我有
- table a 包含列 lot 和 tid
- table b 包含列 lot 和 id
- table t with columns id and flag
我的一个查询将变量 @ID
设置为以下查询,其标志 = 'Y'
第二个查询将变量 @ID_Not_Flag
设置为以下查询,其标志 <> 'Y'
我可以在 1 个查询中执行以下查询(设置 @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
您可以尝试一个支点table。查询的第一部分只是创建临时 tables 来保存数据。
/*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
示例 returns 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 ;
我有
- table a 包含列 lot 和 tid
- table b 包含列 lot 和 id
- table t with columns id and flag
我的一个查询将变量 @ID
设置为以下查询,其标志 = 'Y'
第二个查询将变量 @ID_Not_Flag
设置为以下查询,其标志 <> 'Y'
我可以在 1 个查询中执行以下查询(设置 @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
您可以尝试一个支点table。查询的第一部分只是创建临时 tables 来保存数据。
/*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 示例 returns 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 ;