水平显示查询结果

时间:2010-06-02 19:28:50

标签: sql sql-server tsql

我想知道是否可以获取查询结果并将其作为CSV字符串而不是单元格列返回。

基本上,我们有一个名为Customers的表,我们有一个名为CustomerTypeLines的表,每个Customer可以有多个CustomerTypeLines。 当我针对它运行查询时,当我想检查多种类型时遇到问题,例如:

    Select * 
      from Customers a 
Inner Join CustomerTypeLines b on a.CustomerID = b.CustomerID 
     where b.CustomerTypeID = 14 and b.CustomerTypeID = 66

...没有任何回报,因为客户显然不能同时拥有两者。

为了使其工作,我不得不向顾客添加一个名为,14,66,67,的CustomerTypes字段,这样我就可以做Where a.CustomerTypes like '%,14,%' and a.CustomerTypes like '%,66,%',返回85行。

当然这很痛苦,因为每次更改CustomerTypeLines表时,我必须让我的程序为该Customer重建此字段。

如果我可以在我可以为我工作的地方做一个子查询,那将是很好的,所以不要像以下那样返回结果:

14
66
67

它会像,14,66,67,

一样返回它们

这可能吗?

5 个答案:

答案 0 :(得分:2)

要做到这一点而不进行非规范化,您可以使用类似下面的内容来获取所有符合IN子句中可以加入的所有值的客户的表。

SELECT CustomerId 
FROM CustomerTypes
WHERE CustomerTypeID in (14, 66)
GROUP BY CustomerId
HAVING COUNT(DISTINCT CustomerTypeID) = 2

实际上你在问题中说你已经有一个返回结果的查询,如:

14
66
67

这是以下relational division technique的正确格式。

SELECT * 
FROM Customers c
    WHERE NOT EXISTS
    (
        SELECT * FROM @YourQuery y
        WHERE NOT EXISTS
            (
            SELECT * FROM CustomerTypeLines ctl
            WHERE ctl.CustomerTypeID = y.CustomerTypeID
            AND c.CustomerID = ctl.CustomerID
            )
        )

答案 1 :(得分:1)

我相信您正在寻找的技术将使用COALESCE功能。请参阅http://www.4guysfromrolla.com/webtech/092105-1.shtml

答案 2 :(得分:1)

如果您希望获得同时拥有14和66的所有客户,则可以使用:

SELECT
    C.CustomerID,
    C.SomeColumn
FROM
    Customers C
WHERE
    EXISTS (SELECT * FROM CustomerTypes CT1 WHERE CT1.CustomerID = C.CustomerID AND CT1.CustomerTypeID = 14) AND
    EXISTS (SELECT * FROM CustomerTypes CT2 WHERE CT2.CustomerID = C.CustomerID AND CT2.CustomerTypeID = 66)

更通用的解决方案(根据任意数量的客户类型ID检索客户)取决于您将这些ID传递给SQL的方式(例如,作为存储过程中的表参数)。

答案 3 :(得分:1)

在逗号分隔的列表上执行LIKE查询时,您将遇到各种问题。我知道,我去过那里。

例如,如果您搜索'%,14,%',如果1​​4是列表中的第一个或最后一个项目,会发生什么? (我意识到你指定了额外的前导和尾随逗号,但COALESCE方法不提供这些逗号。)

相反如何:

Select * from Customers a 
Inner Join CustomerTypeLines b 
on a.CustomerID = b.CustomerID 
WHERE a.CustomerID in 
    (SELECT customerID from CustomerTypeLines
     WHERE CustomerTypeID = 14)
AND a.CustomerID in
    (SELECT customerID from CustomerTypeLines
     WHERE CustomerTypeID in 66)

编辑修复问题的过分阅读!

答案 4 :(得分:0)

这是一种痛苦,因为你设计错了。

由于客户与CustomerType有一对多的关系,因此您应创建另一个表来存储这些值,而不是将所有这些值卡在一个字段中。通过这种方式,您可以更轻松地查询这些值。更快。

然后,您可以使用FOR XML PATH子句以逗号分隔记录 http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist