1

ノックアウトしようとしている複雑な SQL Server クエリを取得し、壁にぶつかり、最善/最速の方法がわからない。スタートは良かったのですが、うまくいきませんでした。

content_ids基本的に、次の要件を満たすリストを提供する Select ステートメントを作成する必要があります。

  • 一致content_idするfield_id12680 の一意のfield_values
  • content_idfield_id「はい」を持たない 12643 のうち、同じであるが 12680 を持つ別の行は、content_id「はい」の値とfield_id同じに一致します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 が 1 回発生し、12643 が少なくとも 1 回発生するかどうかをテストする例を次に示します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 に答える