2012-05-14 103 views
1

我有三个表:选择上名广告客户,但包括其父广告商的名字也

广告:产生广告业务的列表,广告:这些广告本身并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') 

好吧,我想我有!

谢谢。

回答

0

我假设层次结构是通过广告客户表中的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,则可以使用BETWEEN,但由于您使用的是SQL Server 2005,因此在您的方案中无法如此。(3)不要使用像m/d/y这样的区域格式来表示字符串文字。事实上,我仍然不确定您的查询是否应该在4月1日或1月4日结束。根据语言和区域设置,SQL Server可能也会错误。

+0

我的日期的数据类型是smalldatetime。 – flavour404

相关问题