我有三张表:
广告商:生产广告的企业列表,广告:广告本身和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')好了,我想我找到了!
谢谢。
发布于 2012-05-15 07:24:35
我假设在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 Server2005。(3)不要对字符串文字使用m/d/y这样的区域格式。事实上,我仍然不确定您的查询是在4月1日结束,还是在1月4日结束。根据语言和区域设置的不同,SQL Server也可能会出错。
https://stackoverflow.com/questions/10591595
复制相似问题