1

我有三张桌子:

Advertisers:产生广告的企业列表,Adverts:广告本身和 AdvertiserChild:Advertiser 父母表;请注意,这是一个扁平的层次结构,单个广告商可以与父级一起多次列出,只要它们只是“父级”,就没有关于“级别”的暗示。

因此,我试图选择在其名称与用户输入匹配的特定日期之间投放广告的所有广告商。问题是该名称还可以匹配父广告商。让我尝试换一种说法,只要孩子在指定日期之间有一些有效的广告,用户输入就可以匹配父广告商或子广告商的名称。

我只是在概念上在获取父信息方面遇到了麻烦:

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 回答