2010-12-07 3 views
0

У меня сложный запрос, который я просто не могу создать. Я собираюсь сделать это с помощью JOIN, но не знаю с чего начать. Я просто попытаюсь объяснить мою проблему как можно яснее.Сложный запрос с SQLite

Я создаю программное обеспечение, которое занимается компенсациями. Каждая компенсация может иметь несколько ссылок (например, в цепочке). Каждая ссылка в основном является клиентом. Таким образом, я просто скажу вам структуру таблицы:

Заказчика

CustomerID | Name 

Компенсация

CompensationID | CustomerID | Date 

Ссылка

LinkID | CompensationID | CustomerID | Sequential 

Теперь, Последовательные поле увеличивается с каждой ссылкой добавлен , Позвольте мне продемонстрировать, заполнив таблицы с некоторыми данными:

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 

Поэтому независимо от того, что LinkID/CompensationID/CustomerID Последовательный всегда идет от 0 до N в таблице ссылок (в зависимости от того, сколько ссылок компенсации есть) ,

Теперь вот проблема: я хочу, чтобы перечислить все компенсации, чьи встречаются Линка следующие требования:

Поиск в Ссылки CustomerID = A Последовательная = 0 (первое звено) и Sequential = LAST (в данном случае 2) Список компенсации

Вот что я получил до сих пор:

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

Это более или менее псевдо SQL, так как я знаю, что могу быть Link.Sequential 0 и другое значение в то же время, но я не знаю, как это сделать.

Любая помощь будет оценена по достоинству.

спасибо.

P.S. Извините за большую стену текста.

+0

Попробуйте с `Link.Sequential = 0 ИЛИ Link.Sequential = LAST` (И будет только оценить, когда 0 это LAST - никогда, если в таблице ссылок больше одной строки). – 2010-12-07 23:09:33

ответ

1

Если подзапросы в котором работают заявления, как я помню:

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

Попробуйте

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 
Смежные вопросы