我正在尝试使用子查询检索某些值但是如果我使用运算符“IN”,则结果显示“StartDate”的相同值,并且只有1个寄存器具有值,其他值为空。
如果我将操作符“IN”更改为“=”,则会收到错误消息,因为子查询返回多个值。
示例:
错误的回复:
MyThread clientId=300&campId=2768 2014-04-02 11:22:20.637
MyThread clientId=300&campId=2917 2014-04-02 11:22:20.637
MyThread clientId=300&campId=3130 2014-04-02 11:22:20.637
正确回报:
MyThread clientId=300&campId=2768 null
MyThread clientId=300&campId=2917 null
MyThread clientId=300&campId=3130 2014-04-02 11:22:20.637
或
MyThread clientId=300&campId=2766 2014-04-12 19:31:49.867
MyThread clientId=300&campId=2918 null
MyThread clientId=300&campId=3130 2014-04-02 11:22:20.637
如何修复查询以返回每行的正确值?
SELECT l.ThreadName,
l.Message,
(SELECT StartDate
FROM DevBase.dbo.CutStatusTask csut
WHERE CampaignId IN
(SELECT REPLACE(PARSENAME(REPLACE(ltmp.Message,'&','.'),1), 'campId=', '')
FROM notifier.Log ltmp
WHERE ltmp.Type = '[RECURRING_START]'
AND l.Type = '[RECURRING_START]')
AND csut.NewStatus = 'TESTING') AS startdate
FROM notifier.log l
WHERE l.Type LIKE '%RECURRING_START%'
提前致谢。
答案 0 :(得分:1)
从你的例子中很难看到表关系,但这样的事情呢?
SELECT l.ThreadName,
l.Message,
csut.StartDate
FROM notifier.log l
INNER JOIN DevBase.dbo.CutStatusTask csut ON csut.CampaignId = l.CampaignId
WHERE csut.CampaignId = REPLACE(PARSENAME(REPLACE(l.Message,'&','.'),1), 'campId=', '')
AND (l.Type LIKE '%RECURRING_START%'
OR
l.Type LIKE '%RECURRING_END%')
答案 1 :(得分:1)
以下查询将搜索“开始日期”和“结束日期”。 INNER JOIN
条件包含RECURRING_START
和RECURRING_END
的条件,使用OR。
SELECT
l.ThreadName,
L.MESSAGE,
CSUT.STARTDATE,
CSUT.ENDDATE
FROM NOTIFIER.LOG L
INNER JOIN DEVBASE.DBO.CUTSTATUSTASK CSUT
ON
(L.TYPE LIKE '%RECURRING_START%' AND CSUT.CAMPAIGNID = REPLACE(PARSENAME(REPLACE(L.MESSAGE,'&','.'),1), 'campId=', ''))
OR
(L.TYPE LIKE '%RECURRING_END%' AND CSUT.CAMPAIGNID = REPLACE(PARSENAME(REPLACE(L.MESSAGE,'&','.'),1), 'campId=', ''));