0

次のフィールドを持つ4つのテーブルがデータベースにあります。

  • gps(gps_id、serial_number)
  • クライアント(client_id、name)
  • client_gps(client_id、gps_id)
  • person_gps(gps_id、date1、date2)

選択したクライアントからのgpsデバイスのすべてのシリアル番号を表示する必要があります。「person_gps」テーブルには、「gps_id」レコードを繰り返すことができます。

このような、

gps_id++++date1++++++++date2
===================================
110   ----10/05/99----05/05/05
110   ----03/02/06----NULL
112   ----03/02/04----04/02/04
112   ----05/09/04----06/08/08
113   ----09/09/09----10/03/10

そして、各gps_idの最後のレコードの「date2」がnullでないことを確認する必要があります。したがって、この例では、id=112およびid=113のgpsからのserial_numberのみを表示する必要があります。

これを行うための最良の方法は何ですか?これらはすべてストアドプロシージャで作成する必要があるため、前に述べたように、client_idは指定されたパラメーター(@client)です。

SQLServer2008を使用しています。

TIA

4

4 に答える 4

1

これを試して:

select * from person_gps a
INNER JOIN client_gps b ON a.gps_id = b.gps_id
INNER JOIN gps c on a.gps_id = c.gps_id
WHERE b.client_id = @client_id and NOT EXISTS (select 1 from person_gps
where x a.gps_id = x.gps_id and x.date2 is null)
于 2012-05-14T13:56:09.273 に答える
0

多分このようなもの:

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY gps_id 
                     ORDER BY date2 DESC) AS RowNbr,
        person_gps.*
    FROM
        person_gps  
)
SELECT
    *
FROM
    gps
    JOIN CTE
        ON gps.gps_id=CTE.gps_id
        AND CTE.RowNbr=1
WHERE EXISTS
    (
        SELECT
            NULL
        FROM
            client_gps
        WHERE
            client_gps.gps_id=gps.gps_id
            AND client_gps.client_id=2--Limit on some clientid
    )
于 2012-05-14T13:52:20.183 に答える
0
SELECT distinct g.serial_number
FROM person_gps pg, client_gps cg, gps g
WHERE cg.client_id = $INPUT
AND pg.gps_id = cg.gps_id
AND g.gps_id = cp.gps_id
AND NOT EXISTS(SELECT 1 
               FROM person_gps
               WHERE gps_id = cg.gps_id
               AND date2 IS NULL)
ORDER BY gps_id
于 2012-05-14T13:52:37.077 に答える
0

これは、selectステートメントを使用して実行できます。

まず、選択する行について考えます。row_number()を使用して最後の行を取得し、date2が正しいことを確認できます。次に、これらを元のレコードに結合して、必要なレコードをプルします。

select *
from person_gsp pg join
     (select pg.gp_id
      from (select pg.*,
                   row_number() over (partition by gps_id order by date1 desc) as seqnum
            from person_gps pg
           ) pg
      where seqnum = 1 and date2 is not null
     ) ids
     on pg.gp_id ids.gp_id
于 2012-05-14T13:53:22.693 に答える