选择名称上的广告商,但也包括他们的父广告商名称

时间:2012-05-14 21:54:24

标签: sql-server-2005

我有三张桌子:

广告商:生成广告的业务列表,广告:广告本身和AdvertiserChild:广告商父母的表格;请注意,这是一个扁平的层次结构,单个广告客户可以与父母一起列出多次,没有提到“级别”,他们只是“父母”。

因此,我尝试选择在名称与用户输入匹配的特定日期之间拥有广告的所有广告客户。问题是该名称也可以与父广告客户匹配。让我尝试使用不同的词组,只要孩子在指定日期之间有一些有效的广告,用户输入就可以匹配父广告客户或子广告客户的名称。

我在概念上遇到有关获取父信息的问题:

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')

好的,我想我有它!

感谢。

1 个答案:

答案 0 :(得分: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可能也会出错。