2010-04-13 9 views
0

Le scénario:requête SQL avec conditionnelle REJOIGNEZ

Tableau 1
CatID | Nom | Description

Tableau2
ITID | Titre | Date | CatID (clé étrangère)

I voulez renvoyer toutes les lignes de Table1 et Title, Date from Table2, où Le retourné du tableau 2 doit être le plus récent par la colonne de date. (dans la deuxième table il de nombreux articles avec la même CatID et moi avons besoin que le dernier)

J'ai 2 requêtes mais ne peut pas les fusionner:

Query 1: 
SELECT Table1.Name, Table1.Description, 
     Table2.Title, Table2.Date 
FROM 
     Table1 LEFT JOIN Table2 ON Table1.CatId=Table2.CatId 

Query2: 

SELECT TOP 1 Table2.Title, Table2.Date 
FROM 
    Table2 
WHERE 
    Table2.CatId = @inputParam 
ORDER BY Table2.Date DESC 
+0

Pouvez-vous essayer Pour mieux expliquer la question? Je pense que vous dites que vous voulez retourner chaque ligne de table1 et avec chaque ligne, et la colonne Title et Data de table2 pour la dernière rangée (Data) la plus récente dans table2 dont CatID correspond à CatID dans table1 – thecoshman

+0

@thecoshman, oui c'est droite. Toutes les lignes de Table1 et les valeurs Title et Data doivent provenir du dernier enregistrement de table2 (avec la même catid) – mariki

Répondre

0

On dirait que vous parlez un maximum de groupwise (nouvelle ligne de Table2 pour chaque ligne correspondante dans Table1), auquel cas, le plus simple est d'utiliser ROW_NUMBER:

WITH CTE AS 
(
    SELECT 
     t1.Name, t1.Description, t2.Title, t2.Date, 
     ROW_NUMBER() OVER (PARTITION BY t1.CatId ORDER BY t2.Date DESC) AS Seq 
    FROM Table1 t1 
    LEFT JOIN Table2 t2 
     ON t2.CatId = t1.CatId 
) 
SELECT * 
FROM CTE 
WHERE Seq = 1 
OR Date IS NULL 
+0

dans PARTITION BY t1.CATId ORDER BY t2.Date, je peux aussi avoir t2.CatId ORDER BY t2.Date, non? – mariki

+0

@mariki: Oui, cette colonne pourrait être 'NULL' car c'est un' LEFT JOIN'. – Aaronaught

+0

et dernière question, y a-t-il une raison pour laquelle vous avez utilisé WITH..AS? Pourquoi ne pas simplement déplacer SELECT * FROM en haut? – mariki

2

Vous pouvez utiliser un UNION, mais vous Je dois faire correspondre les colonnes:

OK, après avoir relu la question, je comprends ce que vous essayez de faire.

Cela devrait faire l'affaire:

SELECT Table1.Name, Table1.Description, 
T2.Title, T2.Date 

FROM 
Table1 

LEFT JOIN (
SELECT CatId, Title, Date, ROW_NUMBER() over (ORDER BY CatId, Date DESC) - RANK() over (ORDER BY CatID) as Num 

FROM Table2) T2 on T2.CatId = Table1.CatId AND T2.Num = 0 
+0

Battez-moi !! – rfonn

+0

pourquoi avez-vous - RANK() sur ..., pourquoi est-ce nécessaire? – mariki

+0

@mariki: C'est ce que "groupe" les dates par 'CatId'. –

0

devrait-il pas ce travail?

SELECT Table1.Name, Table1.Description, 
    T2.Title, T2.Date 
FROM 
    Table1 LEFT JOIN (

SELECT TOP 1 Table2.CatId Table2.Title, Table2.Date 
FROM 
Table2 
WHERE 
Table2.CatId = Table1.catId 
ORDER BY Table2.Date DESC 

) T2 
ON Table1.CatId=T2.CatId 
+0

l'inputparam est le chatId retourné de table1 – mariki

+0

@mariki et maintenant? – mcabral

+0

Je reçois une erreur sur = Table1.CatId L'identificateur en plusieurs parties "Table1.CatId" n'a pas pu être lié. – mariki