2011-12-20 18 views
2

が存在するかどうかを確認してください。アイテムをピックアップするときは、最も低い空のスロットに配置する必要があります。SQL Serverが特定の値を持つレコードは、私は、SQL Serverの非常に簡単な問題を持っている

私は次のスクリプトを使用していますが、それは最初に使用されるスロットの後の最初の空のスロットを返す:

SELECT coalesce ((SELECT MIN(Slot) + 1 FROM Items N1 WHERE N1.name = 'abc' 
AND NOT EXISTS(SELECT * FROM Items N2 WHERE N2.name = 'abc' 
AND N2.Slot = N1.Slot + 1) AND Slot<11),0) 

私はまだ存在していない最低のスロットを見つけるためのスクリプトが必要になります。

ID Slot Name 
10 3 abc 
11 4 abc 

このデータを、それが2正しく返さない:(0を返す必要があります)5を返し、テーブルには、レコードを次のよう、それは動作しません含まれている場合 - それは意味:)

例になります願っています。

ID Slot Name 
10 0 abc 
11 1 abc 

スクリプトは1を返す必要があり、これは11

+0

をあなたには、いくつかのシード・データとどのようなあなたは次の値は、データがそう、我々はあなたが必要なものを明確にすることを与えられることに期待を投稿することができます。 –

+0

Paul:それは変です。あなたが3と4を持っているなら、あなたは0も期待します。しかし、私は代わりに5を得る。 –

+0

私の編集した回答はあなたのために機能しますか? – Akhil

答えて

1
SELECT coalesce (
        (SELECT MIN(N1.Slot) + 1 
         FROM Items N1 
          LEFT OUTER JOIN Items N2 ON N1.Slot+1 = N2.Slot 
         WHERE N1.name = 'abc' 
         AND N2.Slot IS NULL 
         AND N1.Slot < 11) 
        ,0) 
+0

ありがとう、しかし、それはどちらも動作しません。既存のスロットの後に最初の空のスロットが返されます。元の投稿 –

+0

にデータを追加します。あなたの編集した質問によると、上記のような仕事はありません。 – Akhil

+0

編集済みの回答はあなたに適していますか? – Akhil

1
DECLARE @Items TABLE (
    ID INT, 
    Slot INT, 
    Name VARCHAR(50) 
) 

INSERT INTO @Items VALUES (10, 0, 'ABC') 
INSERT INTO @Items VALUES (11, 2, 'ABC') 
INSERT INTO @Items VALUES (12, 3, 'ABC') 

INSERT INTO @Items VALUES (13, 0, 'EFG') 
INSERT INTO @Items VALUES (14, 1, 'EFG') 
INSERT INTO @Items VALUES (15, 2, 'EFG') 
INSERT INTO @Items VALUES (16, 3, 'EFG') 
INSERT INTO @Items VALUES (17, 4, 'EFG') 

SELECT 
    i.Name, 
    MIN(i.Slot + 1) AS LowestSlot 
FROM 
    @Items i 
    LEFT JOIN @Items i2 ON i2.Slot = i.Slot + 1 AND i2.Name = i.Name 
WHERE 
    -- i.Slot + 1 < 11 or, i.Slot < 10 
    i.Slot < 10 AND 
    i2.ID IS NULL 
GROUP BY 
    i.Name 
+0

ありがとう、働いている –

1

より低い最初の使用されていない番号(スロット)であるとして、問題の主な問題は、考案する必要があるということですデータ。あなたのスロットに0〜11の番号が付けられていることをMSSQLはどのように知っていますか?なぜ、-3 - 19?明らかに、答えは「あなたがそう言ったからです」ですが、MSSQLに伝える必要があります。 MSSQLで

あなたは基本的なスロット情報を保持するテーブル変数を作成し、

DECLARE @tv TABLE (
    ID INT 
) 

INSERT INTO @tv 
VALUES 
(0), 
(1), 
(2), 
(3), 
(4), 
(5), 
(6), 
(7), 
(8), 
(9), 
(10), 
(11) 

SELECT 
    MIN(t.ID) + 1 AS EmptySlot 
FROM 
    @tv t 
    LEFT JOIN Item i 
     ON t.ID = i.ID 
WHERE 
    ISNULL(i.Slot, 0) = 0 
0

@サイモンのクエリ上の変化は空であるものを把握するために、それに対するあなたのアイテムのテーブルに参加することができます。これは、SQL-Server 2008で動作します。

SELECT 
    MIN(t.Slot) AS EmptySlot 
FROM 
     (VALUES 
     (0), (1), (2), (3), 
     (4), (5), (6), (7), 
     (8), (9), (10), (11) 
    ) AS t(Slot) 
    LEFT JOIN 
     Items AS i 
     ON i.Slot = t.Slot 
WHERE 
    i.Slot IS NULL 

か:

SELECT 
    MIN(t.Slot) AS EmptySlot 
FROM 
    (VALUES 
    (0), (1), (2), (3), 
    (4), (5), (6), (7), 
    (8), (9), (10), (11) 
) AS t(Slot) 
WHERE 
    NOT EXISTS 
     (SELECT * 
     FROM Items AS i 
     WHERE i.Slot = t.Slot 
    ) 
関連する問題