假设我们得到如下原始查询:
SELECT A, B, C FROM tblA
现在,我需要额外的人工行 选择'Kyala',B,C FROM tblA ,例如,当C = 100时,将其插入到结果集中。
例如,如果tblA持有一行:
A B C
John 1 100
我的目标是使用单个SQL查询返回如下所示的两行。
A B C
John 1 100
Kyala 1 100
我怎样才能实现使用单个SQL 而不是依赖于表变量或临时表?
答案 0 :(得分:2)
刚改进查询以解决Union上的错误:
SELECT A, B, C from tblA
UNION
SELECT 'Kyala' as A, B, C FROM tblA WHERE C = 100
如果你不想要c = 100的其他人并且仍然在结果中获得A(来自工会中的第一个Select),你可以这样做:
SELECT A, B, C from tblA WHERE C <> 100
UNION
SELECT 'Kyala', B, C FROM tblA WHERE C = 100
或
SELECT CASE(C)
when 100 then 'Kyala'
else A
END as A, B, C from tblA
答案 1 :(得分:1)
您可以使用CASE:
SELECT B, C,
CASE
WHEN C = 100 THEN 'Kyala'
ELSE A
END
FROM tblA
答案 2 :(得分:0)
您可以使用UNION运算符实现此目的。
SELECT A, B, C from tblA
UNION
SELECT 'Kyala', B, C FROM tblA WHERE C = 100
回答有关提高性能的评论中的问题,以便只查询一次表 - 您可以在列C和B上添加覆盖索引,以便查询的第二部分使用该索引而不是查询表:
CREATE NONCLUSTERED INDEX [IX_tblA_CD] ON [dbo].[tblA]
(
[C] ASC
)
INCLUDE ( [B]) ON [PRIMARY]
GO
但是,根据用例(这听起来像某种特殊的测试过程?),您可能更愿意接受两次表扫描,而不是添加一个可能不适合使用的新索引在生产中。
答案 3 :(得分:0)
您可以使用UNION语句:
SELECT A, B, C FROM tblA
UNION
SELECT 'Kyala', B, C FROM tblA WHERE C = 100
答案 4 :(得分:-4)
I need to additional artificial rows like SELECT 'Kyala', B, C FROM
tblA,例如,当C = 100时 插入到结果集中。
现在,请阅读.... *在SQL Server中的IF * SWITCH等。
基本上,您可以如图所示定义其他列
(SELECT 'test', A, B, C FROM...)
但是,不是'test',你可以输入if或switch并使用其他字段来确定要输出的确切内容。
SELECT IF (xxxx) AS FirstColumn, A, B,
C FROM ...