2010-12-07 19 views
0

J'ai une requête compliquée que je ne peux pas créer. Je pense à le faire avec JOIN mais je ne sais pas par où commencer. Je vais essayer d'expliquer mon problème aussi clairement que possible. Je crée un logiciel qui traite des compensations. Chaque compensation peut avoir plusieurs liens (comme dans une chaîne). Chaque lien est essentiellement un client. Alors, je vais vous dire les structures de table:Requête compliquée avec SQLite

client

CustomerID | Name 

Compensation

CompensationID | CustomerID | Date 

Lien

LinkID | CompensationID | CustomerID | Sequential 

Maintenant, le champ séquentiel augmente avec chaque lien ajouté . Permettez-moi de démontrer en remplissant les tables avec des données:

CustomerID | Name 
-----------+----- 
0   | Foo 
1   | Bar 
2   | Baz 

CompensationID | CustomerID | Date 
---------------+------------+------ 
0    | 0   | 2-2-2010 
1    | 1   | 2-3-2010 


    LinkID | CompensationID | CustomerID | Sequential 
    -------+----------------+------------+----------- 
    0    0    0   0 
    1    0    2   1 
    2    0    1   2 

Donc, peu importe ce que le LinkID/CompensationID/CustomerID Séquentielle passe toujours de 0 à N dans le tableau Liens (selon le nombre de liens d'une rémunération a) .

Maintenant, voici le problème: je veux énumérer tous dont de rémunération de répondre de lien aux exigences suivantes:

Chercher dans Liens CustomerID = A séquentielle = 0 (premier lien) et séquentielle = DERNIER (dans ce cas 2) Liste des compensations

Voici ce que je suis arrivé à ce jour:

SELECT * FROM Compensation JOIN Link ON Compensation.ID = Link.CompensationID 
WHERE Link.CustomerID=A AND Link.Sequential = 0 AND Link.Sequential=LAST 

Ceci est plus ou moins pseudo SQL car je sais Link.Sequential ne peut pas être 0 et une autre valeur en même temps, mais je ne sais pas comment faire cela.

Toute aide serait appréciée.

Merci.

P.S. Désolé pour le grand mur de texte.

+0

Essayez avec 'Link.Sequential = 0 OU Link.Sequential = LAST' (ET n'évaluera quand 0 est le DERNIER - jamais s'il y a plus d'une rangée dans la table des liens). –

+0

Donc, vous voulez tous les premiers liens et tous les derniers liens pour un seul client? – OrangeDog

+0

J'ai fondamentalement besoin de vérifier si les première et dernière lignes du lien ont le code client de A. J'ai donc besoin de vérifier deux lignes, pas une seule. – vanneto

Répondre

1

Si dans les sous-requêtes où les déclarations de travail que je me souviens:

select * 
from 
    Compensation 
left join 
    Link 
on Compensation.CompensationID = Link.CompensationID 
where 
    Link.CustomerID = :A 
    AND (
    Link.Sequential = 0 
    OR 
    Link.Sequential = (
     select MAX(Sequential) from Link where Link.CustomerID = :A 
    ) 
) 
0

Essayez

SELECT c.* 
FROM Compensation c 
JOIN (select CompensationID, MAX(Sequential) AS LastSeq FROM Link GROUP BY CompensationID) AS LastOnes ON c.ID = LastOnes.CompensationID 
JOIN (select CompensationID FROM Link WHERE CustomerID=A AND Sequential=0) AS FirststOnes ON c.ID = FirststOnes.CompensationID 
JOIN Link AS l on l.CompensationID=c.CompensationID AND l.CustomerID=A AND l.Sequential=LastOnes.LastSeq