1

我有一个复杂的 SQL Server 查询,我试图敲掉它,碰壁,不确定最好/最快的方法。我有一个良好的开端,但并不顺利。

基本上,我需要创建一个 Select 语句,该语句将content_ids满足以下要求:

  • 唯一content_idfield_id12680field_values匹配的
  • content_id其中field_id12643 没有“是”,但另一行相同content_idfield_id12680 与content_id“是”的值匹配
  • create_date在过去 24 小时内包含的项目

数据库如下所示:

content_id | field_id | field_value                             | create_date
_________________________________________________________________________________________
12         | 12680    | 210b1183c3718142594425ab9538376ebb7f1e0 | 2012-02-21 22:44:51.167
12         | 12643    | Yes                                     | 2012-02-21 22:44:51.167
13         | 12680    | 210b1183c3718142594425ab9538376ebb7f1e0 | 2012-02-21 22:44:51.167
13         | 12643    |                                         | 2012-02-21 22:44:51.167

这是我到目前为止得到的:

SELECT DISTINCT Event1.content_id
FROM tblIVTextData AS Event1
    JOIN tblIVTextData AS Event2
        ON (Event1.content_id != Event2.content_id AND 
            Event1.field_value = Event2.field_value)
    JOIN tblIVTextData AS Event3
        ON(Event3.field_id = 12643 AND
           Event3.field_value = 'Yes' AND
           Event3.content_id = Event1.content_id)
    WHERE Event1.field_id = 12680 AND 
        Event1.create_date > dateadd(hh, -300, getdate())

我在选择与 field_values 匹配的“是”的第一次出现时迷失了方向。关于如何完成此或性能改进的任何建议?

4

2 回答 2

3

我不了解您的条件,也不了解示例查询(您说“24”小时作为条件,但在 SQL 中使用“300”小时)。

having但是,我认为您可以使用聚合和子句做您想做的事情。这是一个示例,它测试 12680 的一次出现和 12643 的至少一次出现field_value <> 'Yes'

select e.ContentId
from tblIVTextData e
where e.create_date > dateadd(hh, -24, getdate())
group by e.ContentId
having sum(case when field_id = 12680 then 1 else 0 end) = 1 and
       sum(case when field_id = 12643 and field_value <> 'Yes' then 1 else 0 end) > 0
于 2013-08-27T15:53:46.340 回答
0
with content_cte(content_id,field_id)as
(select distinct content_id,field_id from tblIVTextData where content_id=12643 
and field_value <>'Yes')

SELECT DISTINCT Event1.content_id
FROM 
tblIVTextData AS Event1
JOIN tblIVTextData AS Event2
ON (Event1.content_id != Event2.content_id AND 
Event1.field_value = Event2.field_value)
JOIN content_cte AS Event3
ON(Event3.content_id = Event1.content_id AND Event1.field_value='Yes')
WHERE Event1.field_id = 12680 
Event1.create_date > dateadd(hh, -24, getdate())
于 2013-08-27T15:57:47.353 回答