【发布时间】:2018-05-21 18:12:28
【问题描述】:
我有一个包含多个连接的查询,我想将两列中的记录合并为一列。如果一列是空的,那么我想显示一列值作为结果。我尝试使用CONCAT、COALEASE 和ISNULL,但没有运气。我在这里错过了什么?
我的目标是,从查询中创建一个包含s.Script AS Original 和FromAnotherTable 组合的列。下面的查询运行但抛出Invalid column name 'Original' 和Invalid column name 'FromAnotherTable'。当我尝试使用CONCAT、COALEASE 或ISNULL 时。
SQL 查询:
SELECT DISTINCT
c.Name AS CallCenter,
LTRIM(RTRIM(s.Name)) Name,
d.DNIS,
s.ScriptId,
s.Script AS Original,
(
SELECT TOP 5 CCSL.Line+'; '
FROM CallCenterScriptLine CCSL
WHERE CCSL.ScriptId = s.ScriptId
ORDER BY ScriptLineId FOR XML PATH('')
) AS FromAnotherTable,
--CONCAT(s.Script, SELECT TOP 5 CCSL.Line+'; ' FROM dbo.CallCenterScriptLine ccsl WHERE ccsl.ScriptId = s.ScriptId ORDER BY ccsl.ScriptLineId xml path(''))
--CONCAT(Original, FromAnotherTable) AS Option1,
--COALESCE(Original, '') + FromAnotherTable AS Option2,
--ISNULL(Original, '') + FromAnotherTable AS Option3,,
r.UnitName AS Store,
r.UnitNumber
FROM CallCenterScript s WITH (NOLOCK)
INNER JOIN CallCenterDNIS d WITH (NOLOCK) ON d.ScriptId = s.ScriptId
INNER JOIN CallCenter c WITH (NOLOCK) ON c.Id = s.CallCenterId
INNER JOIN CallCenterDNISRestaurant ccd WITH (NOLOCK) ON ccd.CallCenterDNISId = d.CallCenterDNISId
INNER JOIN dbo.Restaurant r WITH (NOLOCK) ON r.RestaurantID = ccd.CallCenterRestaurantId
WHERE c.Id = 5
AND (1 = 1)
AND (s.IsDeleted = 0 OR s.IsDeleted IS NULL)
ORDER BY DNIS ASC;
这行得通:
DECLARE @Column1 VARCHAR(50) = 'Foo',
@Column2 VARCHAR(50) = NULL;
SELECT CONCAT(@Column1,@Column2);
SELECT COALESCE(@Column2, '') + @Column1
SELECT ISNULL(@Column2, '') + @Column1
所以我不确定原始查询中缺少什么。
【问题讨论】:
-
我不确定你想达到什么目的,但我查看了代码并且我有一个问题:我看到你正在计算列脚本与 XML 子句,以及你下面的 SELECT 中的两行指的是专栏脚本。你在做吗?
-
小心使用那个 nolock 提示。它比大多数人意识到的要险恶得多。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere
-
@BartoszSiemasz 所以基本上,我只从一张桌子上阅读,现在我从两张桌子上阅读。使用 XML 的唯一原因是将多行合二为一。这能回答你的问题吗?
-
你为什么要连接
s.Script +'; ', Script?你觉得s.Script和Script有什么区别?你的别名子查询?尝试给它一个不同的名称以避免歧义。
标签: sql-server sql-server-2017