2010-10-07 7 views
1

Tableau de capture d'image: http://img844.imageshack.us/img844/6213/99730337.jpgBesoin d'aide pour la requête SQL select pour cette table deux

------------ PositionTable------------ 
ID ContentFK Position 
11  100    1 
12  101    1 
13  104    2 
14  102    2 
15  103    2 
16  105    3 
17  106    3 
18  107    2 


----------Content Table ------------ 
ContentID UpdateDate Title 
100   11.10.2009 Aol 
101   12.10.2009 Microsoft 
102   12.10.2009 e-Bay 
103   12.11.2009 google 
104   16.11.2009 novell 
105   17.11.2009 asus 
106   16.11.2009 nokia 
107   11.11.2009 samsung 

Qui peut me aider à la question entre les deux tables Mon scénario.

Trier par numéro comme Position 1,2,3. Cependant, un certain nombre de groupes à la liste un seul enregistrement (commande par Position ASC (Position: 1,2,3)

Avec PositionTable.ContentFK = ContentTable.ContentID par UpdateDate de dernière mise à jour dans ContentTablo

.

Comment puis-je obtenir la liste même résultat que

p.Postion  p.ID   p.ContentFK  c.UpdateDate  c.Title 

1    12    101    12.10.2009  Microsoft 
2    13    104    16.11.2009  novell 
3    16    105    17.11.2009  asus 

Merci à tous,

Répondre

2

Cela devrait le faire:

EDIT: Le code d'origine était parce que je pensais que vos dates étaient MM.DD.YYYY. Réalisé vos dates étaient JJ.MM.AAAA et ajusté le code en conséquence.

EDIT 2: Changement de réponse basé sur les commentaires pour le type de données UpdateDate.

;with cteMaxDate as (
    select p.Position, MAX(c.UpdateDate) as MaxDate 
     from PositionTable p 
      inner join ContentTable c 
       on p.ContentFK = c.ContentID 
     group by p.Position 
) 
select p.Position, p.ID, p.ContentFK, c.UpdateDate, c.Title 
    from cteMaxDate m 
     inner join PositionTable p 
      on m.Position = p.Position 
     inner join ContentTable c 
      on p.ContentFK = c.ContentID 
       and m.MaxDate = c.UpdateDate 
+0

+1 - Bonne prise à la date - Je pensais que c'était MM.DD.YYYY au début aussi. En supposant que c'est une chaîne, on ne pourrait pas faire un MAX sur le UpdateDate tel qu'il est, ce qui est ce que vous avez couvert. – LittleBobbyTables

+0

Merci. Je veux donner un résultat complet. – user469272

+0

UpdateDate type: SmallDateTime – user469272

0

un peu laid (et corrélative), mais c'est la façon la plus simple de la sous-requête que je peux penser à le faire.

En supposant que votre colonne UpdateDate est DATETIME - sinon vous aurez à faire quelque chose comme Joe a fait (ou, mieux, changer la colonne DATETIME :-)

select p.Position 
    ,p.ID 
    ,p.ContentFK 
    ,c.UpdateDate 
    ,c.Title 
from PositionTable p 
join ContentTable c 
    on p.ContentFK = c.ContentID 
    and c.UpdateDate = (select max(ic.UpdateDate) from ContentTable ic 
          join PositionTable ip 
           on ip.ContentFK = ic.ContentID 
          where ip.Position = p.Position) 
order by p.Position 
+0

Juste remarqué que moi-même et modifié en conséquence. –

+0

Merci c'est du travail. Type de UpdateDate: SmallDateTime – user469272

0

Essayez:

select Position, ID, ContentFK, UpdateDate, Title 
from (
select p.Position, 
    p.ID, 
    p.ContentFK, 
    c.UpdateDate, 
    c.Title, 
    row_number() over (partition by p.Position order by p.Position, c.UpdateDate desc) as num 
from Position p inner join 
    Content c on p.ContentFK = c.ContentId) a 
where num = 1 
+0

Et si Google avait une date de '12 .11.2010 '? – LittleBobbyTables

+0

Je suppose que c'est un champ datetime ici et que le format de chaîne douteuse est un problème distinct. il devrait bien sûr être YYYYMMDD pour être totalement sûr. – MLT

+0

Erreur de retour: nom d'objet invalide 'Position'. Je ne peux pas le réparer – user469272