代码之家  ›  专栏  ›  技术社区  ›  AndyD273

水平显示查询结果

  •  0
  • AndyD273  · 技术社区  · 14 年前

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

    基本上,我们有一个名为Customers的表,还有一个名为CustomerTypeLines的表,每个客户可以有多个CustomerTypeLines。 对其运行查询时,如果要检查多个类型,就会遇到问题,例如:

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

    …不返回任何内容,因为很明显,客户不能同时使用这两种内容。

    为了让它工作,我不得不给客户添加一个名为CustomerTypes的字段 ,14,66,67, 所以我可以做一个 Where a.CustomerTypes like '%,14,%' and a.CustomerTypes like '%,66,%' 返回85行。

    当然,这很痛苦,因为每次更改CustomerTypeLines表时,我都必须让程序为该客户重新生成此字段。

    如果我能在我的where中做一个子查询,这将是一件很好的事情,因此不要返回如下结果:

    14
    66
    67
    

    ,14,66,67,

    这可能吗?

    5 回复  |  直到 14 年前
        1
  •  1
  •   egrunin    14 年前

    你会遇到各种各样的问题 LIKE

    例如,如果您搜索 '%,14,%' ,如果14是列表中的第一项或最后一项,会发生什么情况(我知道您指定了额外的前导和尾随逗号,但是 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)
    

        2
  •  2
  •   Martin Smith    14 年前

    要做到这一点而不去规范化,您可以使用如下方法来获得一个包含所有客户的表,该表匹配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
                )
            )
    
        3
  •  1
  •   Chad Levy    14 年前

    我相信你要找的技术会利用 COALESCE http://www.4guysfromrolla.com/webtech/092105-1.shtml .

        4
  •  1
  •   Tom H    14 年前

    如果您希望获得所有同时拥有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(例如,作为存储过程的表参数)。

        5
  •  0
  •   Ed B    14 年前

    很痛苦,因为你设计错了。

    因为客户与CustomerType有一对多的关系,所以您应该创建另一个表来存储这些值,而不是将所有这些值塞进一个字段中。这样,您可以更轻松地查询这些值;更快。

    http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist