我想知道是否可以采取查询的结果,并返回将其作为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表改变时重建这个领域为客户。
这将是很好,如果我可以做一个子查询我哪里会做的工作对我来说,这样的而不是返回的结果,如:
14
66
67
它会返回他们喜欢,14,66,67,
这可能吗?
你会碰到各种各样的做一个问题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)
编辑以解决问题的overhasty阅读!
要做到这一点,而不denormalising可以使用类似下面的东西把所有的IN子句,然后可以加入对匹配的所有值的客户的表。
SELECT CustomerId
FROM CustomerTypes
WHERE CustomerTypeID in (14, 66)
GROUP BY CustomerId
HAVING COUNT(DISTINCT CustomerTypeID) = 2
事实上,你在你的问题,你已经有一个返回的结果类似的查询:
14
66
67
这是按照已经正确的格式关系分割技术 。
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
)
)
我相信你正在寻找该技术将利用的COALESCE
功能。 见http://www.4guysfromrolla.com/webtech/092105-1.shtml 。
如果你想要得到谁同时拥有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(例如,作为表paramater到一个存储过程)。
这是一个痛苦,因为你的设计是错误的。
由于客户有一个与CustomerType一对多的关系,您应该创建另一个表来存储,而不是在一个场干扰所有这些值的值。 这样,你就可以查询这些值很多更加简单快捷。
然后你可以使用FOR XML PATH子句以逗号分隔的记录http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist