SqLServer - 子查询返回相同的值而不是null

时间:2014-05-27 13:10:11

标签: sql sql-server

我正在尝试使用子查询检索某些值但是如果我使用运算符“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%'

提前致谢。

2 个答案:

答案 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_STARTRECURRING_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=', ''));