2012-05-14 2 views
1

을 상위 광고주 이름을 포함 광고주 부모의 테이블을; 이 광고는 단순한 계층 구조이며 하나의 광고주가 상위 광고와 함께 여러 번 게재 될 수 있으며 '수준'에 대한 암시는 단순히 '부모'임을 나타냅니다.나는 세 개의 테이블이 이름에 광고주의 선택뿐만 아니라

그래서 특정 날짜 사이에 광고가있는 모든 광고주를 선택하고 이름이 사용자 입력과 일치해야합니다. 이름이 부모 광고주와도 일치 할 수 있다는 점에주의해야합니다. 달리 말하면 사용자가 입력 한 내용은 지정된 날짜 사이에 유효한 광고가있는 한 상위 또는 하위 광고주의 이름과 일치 할 수 있습니다.

난 그냥 거기에 부모의 정보를 얻기에 관해서 개념적 문제가 있습니다 :

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 인 경우에는 BOM을 사용하지 마십시오. SQL Server 2005를 사용하고 있기 때문에 상황에 따라 다를 수 있습니다. (3) 문자열 리터럴에 대해 m/d/y와 같은 지역 서식을 사용하지 마십시오. 사실 귀하의 질의가 4 월 1 일 또는 1 월 4 일에 끝나기로되어 있는지 확실하지 않습니다. 언어 및 국가 별 설정에 따라 SQL Server가 잘못 될 수도 있습니다.

+0

날짜에 대한 내 데이터 유형은 smalldatetime입니다. – flavour404

관련 문제