开发者

Complicated query with SQLite

开发者 https://www.devze.com 2023-01-29 03:51 出处:网络
I have a complicated query that I just cant create. I\'m thinking of doing it with JOIN\'s but don\'t know where to start. I\'ll just try to explain my problem as clearly as possible.

I have a complicated query that I just cant create. I'm thinking of doing it with JOIN's but don't know where to start. I'll just try to explain my problem as clearly as possible.

I am creating software that deals with compensations. Every compensation can have several links (like in a chain). Each link is basically a customer. So, I'll just tell you the table structures:

Customer

CustomerID | Name

Compensation

CompensationID | CustomerID | Date

Link

LinkID | CompensationID | CustomerID | Sequential

Now, the Sequential field increases with every link added. Let me demonstrate by filling the tables with some data:

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

So no matter what the LinkID/CompensationID/CustomerID the Sequential always goes from 0 to N in the Links table (depending on how many links a compensation has).

Now here is the problem: I want to list all Compensation's whose Link's meet the following requirements:

Search in Links CustomerID = A Sequential = 0 (first link) AND Sequential = LAST (in this case 2) List compe开发者_StackOverflownsations

Here is what I got so far:

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

This is more or less pseudo SQL since I know Link.Sequential cant be 0 and another value at the same time, but I don't know how to do this.

Any help would be appreciated.

Thank you.

P.S. Sorry for the big wall of text.


If subqueries in where statements work how I remember:

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
    )
  )


Try

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
0

精彩评论

暂无评论...
验证码 换一张
取 消