1

私は3つのテーブルを持っています:

Advertisers: 広告を作成するビジネスのリスト、Adverts: 広告自体、AdvertiserChild: Advertisers の親のテーブル。これはフラットな階層であり、単一の広告主が親と共に複数回リストされる可能性があることに注意してください。単に「親」である場合、「レベル」については何もわかりません。

そのため、特定の日付の間に広告があり、その名前がユーザーの入力と一致するすべての広告主を選択しようとしています。問題は、名前が親広告主とも一致する可能性があることです。別の言い方をしてみましょう。ユーザー入力は、指定された日付の間に子広告主に有効な広告がある限り、親広告主または子広告主の名前と一致できます。

そこに親情報を取得することに関して、私は概念的に問題を抱えています:

SELECT     NewsPaperAd.AdvertiserID AS ADID, Advertiser.NameAbbrev AS Name
FROM         NewsPaperAd INNER JOIN
                  Advertiser ON NewsPaperAd.AdvertiserID = Advertiser.AdvertiserID
WHERE     (NewsPaperAd.PubDate BETWEEN '1/1/2012' AND '4/1/2012')

わかりました、私はそれを持っていると思います!

ありがとう。

4

1 に答える 1

0

階層は、Advertiser テーブルの ParentID または同様の列で定義されていると仮定します。次に、次のようなものが機能する可能性があります。

DECLARE @search NVARCHAR(255);
SET @search = '%some search phrase%';

;WITH a AS
(
  SELECT a.AdvertiserID, a.NameAbbrev, Parent = p.NameAbbrev
    FROM dbo.Advertiser AS a
    LEFT OUTER JOIN dbo.Advertiser AS p
    ON a.ParentID = p.AdvertiserID
    WHERE a.NameAbbrev LIKE @search
    OR p.NameAbbrev LIKE @search
)
SELECT ADID = a.AdvertiserID, a.NameAbbrev, a.Parent
  FROM dbo.NewsPaperAd AS n
  INNER JOIN a
  ON a.AdvertiserID = a.AdvertiserID
  WHERE n.PubDate >= '20120101'
  AND n.PubDate < '20120401';

いくつかの提案: (1) 列の出力名を変更しないでください。ADID は AdvertiserID とは異なります。略語のポイントは何ですか?(2) 日付/時刻範囲のクエリに BETWEEN を使用しないでください...データ型が DATE の場合は問題ありませんが、SQL Server 2005 を使用しているため、シナリオではそうではありません。 (3)文字列リテラルに m/d/y のような地域の書式設定を使用しないでください。実際、あなたの質問が 4 月 1 日に終了するのか、1 月 4 日に終了するのか、まだわかりません。言語と地域の設定によっては、SQL Server も間違っている可能性があります。

于 2012-05-14T23:24:34.853 に答える