1

我有一个返回几列和一些信息的查询。我想硬编码一个列表,并让每一行从我的列表中返回每个值。

所以,目前我SELECT正在返回,例如,

ID   Name   Value
1    Mike   404
2    John   404

例如,我希望在 my 中添加一列,SELECT以便每行也返回一个经理姓名。所以我有一组管理器,我想将它们自己写入 SELECT 语句(即这些不是从任何外部源返回的,我想将它们硬编码到我的SELECT):{'Steve','Bill'}。我现在想要返回的是:

ID   Name   Value   Manager
1    Mike   404     Steve
2    John   404     Steve
1    Mike   404     Bill
2    John   404     Bill

是否有可能做到这一点?如果是这样,怎么做?:)

非常感谢。

4

3 回答 3

1

一种方法是使用UNION ALL并将CROSS APPLY它们与您的行连接:

SELECT p.ID, p.Name ,p.Value, x.Col AS Manager
FROM dbo.Persons p
CROSS APPLY (SELECT Col FROM (SELECT 'Steve' UNION ALL SELECT 'Bill')AS T(Col))X

如果管理器是逗号分隔的列表,您需要 SQL-Server 2005 中的拆分功能,例如:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

现在这有效:

SELECT p.ID, p.Name ,p.Value, s.Item AS Manager
FROM dbo.Persons p
CROSS APPLY dbo.Split('Steve,Bill', ',')s

结果(SQL-Fiddle 已关闭):

ID  Name    Value   Manager
1   Mike    404     Steve
2   John    404     Steve
1   Mike    404     Bill
2   John    404     Bill
于 2013-06-19T08:17:01.377 回答
0

此查询将为您提供所需的确切结果

select ID,Name,Value, Manager  from Test
cross join

(select 'Bill' Manager
union
select 'Steve' Manager) t1
于 2013-06-19T08:20:40.563 回答
0

好吧,正如你提出的问题

SELECT A.ID, A.Name, A.Value, B.Manager FROM
(
SELECT ID, Name, Value FROM MyTable
) A
CROSS JOIN
(
SELECT
 'Steve' Manager
UNION
SELECT
 'Bill' Manager
) B

坦率地说,我总是在(它自己的)表中存储经理

于 2013-06-19T08:21:24.050 回答