2011-12-20 86 views
2

我在SQL Server中很簡單的問題:SQL服務器 - 檢查特定值的記錄是否存在

用戶可以具有在表ID和插槽代表12個項目(插槽0-11)。拾取物品時,應將其放置在最低的空槽中。

我使用下面的腳本,但它的第一個使用時隙之後返回第一個空槽:

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) 

我需要的腳本來發現並不存在最低插槽。希望這是有道理的:)

一個例子 - 如果表包含以下記錄,這是行不通的,返回5(應該返回0):

ID Slot Name 
10 3 abc 
11 4 abc 

有了這些數據,它不正確地返回2。

ID Slot Name 
10 0 abc 
11 1 abc 

腳本應該返回1,因爲這是第一個未使用編號(slot)低於11

+0

你可以張貼一些種子數據和你所期望的給予下一個值的數據,所以我們可以是你需要清楚什麼。 –

+0

保羅:那很奇怪。如果你有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

爲真。根據你編輯的問題與例子,上述wouldnt工作。 – 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

這個問題的主要困難是,它需要發明數據。 MSSQL如何知道您的插槽編號爲0 - 11?爲什麼不是-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 
    ) 
相關問題