我想知道是否可以获取查询结果并将其作为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,
这可能吗?
答案 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,%'
,如果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)
编辑修复问题的过分阅读!
答案 4 :(得分:0)
这是一种痛苦,因为你设计错了。
由于客户与CustomerType有一对多的关系,因此您应创建另一个表来存储这些值,而不是将所有这些值卡在一个字段中。通过这种方式,您可以更轻松地查询这些值。更快。
然后,您可以使用FOR XML PATH子句以逗号分隔记录 http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=createacommadelimitedlist