3

私のテーブルには次のデータがあります。

ID name  devID
1  abc    101
2  def    111
3  ghi    121
4  abc    102
5  def    110

次の条件に基づいて行 (ID、名前、devID) を選択したい:

を。名前 abc の devID の値が 1 増加したため、より高い値のレコードのみが結果に表示されます (102 のみ)。

b. name def の devID の値が 1 減っているため、すべてのレコード (111 および 110) が表示されるはずです。

また、さまざまな行のレコードを追加し続け、各名前のテーブル内の行数は 2 行または最大 3 行を超えないため、上記の条件は常に真である必要があります。

このクエリで私を助けてください。前もって感謝します。

4

4 に答える 4

2

INNER JOINをそれ自体と結果で使用するUNIONことは、良いアプローチになる可能性があります。

SQL フィドル

/* select all rows that match criteria A */
SELECT d2.ID, d2.name, d2.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID + 1 
                             AND d2.ID > d1.ID
UNION
/* select first rows that match criteria B */
SELECT d1.ID, d1.name, d1.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID - 1 
                             AND d2.ID > d1.ID
UNION
/* select second rows that match criteria B */
SELECT d2.ID, d2.name, d2.devID
FROM   data d1
       INNER JOIN data d2 ON d2.devID = d1.devID - 1 
                             AND d2.ID > d1.ID
于 2013-05-22T18:33:54.793 に答える
2

私は増分アプローチを使用しました。私は本当に別のオプションを見ませんでした。これは、私が信じている必要なものを返します:

create table #t1
(
    ID int identity,
    name varchar(3),
    devID int
)

insert into #t1(name,devID)
values('abc',101),('def',111),('ghi',121),('abc',102),('def',110)


create table #t2
(
    ID int,
    name varchar(3),
    devID int
)

declare @count int = 1,
    @name1 varchar(3)
while @count <= (select MAX(ID) from #t1)
begin--1
    set @name1 = (select name from #t1 where ID = @count)
    if (@name1 not in (select distinct name from #t2)) or ((select devID from #t1 where ID = @count) < (select devID from #t2 where name = @name1))
    begin--2
        insert into #t2
            select *
            from #t1
            where ID = @count
    end--2
    else
    begin--2
        update #t2
            set devID = (select devID from #t1 where ID = @count)
            where name = @name1
    end--2

    set @count+=1
end--1

select *
from #t2

drop table #t1
drop table #t2

編集:結果:

ID          name devID
----------- ---- -----------
1           abc  102
2           def  111
3           ghi  121
5           def  110

(4 row(s) affected)
于 2013-05-22T18:22:06.970 に答える