在SQL Server中创建超集

时间:2013-06-19 08:06:08

标签: sql sql-server database sql-server-2005 select

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

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

ID   Name   Value
1    Mike   404
2    John   404

比方说,我想在我的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

有可能这样做吗?如果是这样,怎么样? :)

非常感谢。

3 个答案:

答案 0 :(得分:1)

一种方法是使用UNION ALLCROSS 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

答案 1 :(得分:0)

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

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

(select 'Bill' Manager
union
select 'Steve' Manager) t1

答案 2 :(得分: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

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