0

我什至不知道如何开始搜索这个。

让我解释一下我想要做什么:

我有一个变量值映射表。 一个变量可以分配多个值,也可以将同一个值分配给多个变量

用户能够删除变量/值。但是,如果有任何变量只分配了该特定值,则不应允许删除该值。否则变量将保持未被删除,但分配了 0 值,这是错误的。

现在,在用户尝试从特定变量中删除值时,我想检查:

如果对于选定的 valueID,有任何 variableID 只分配了一个 valueID,并且该 valueID 是用户试图删除的那个。 如果是,则中止。否则继续。

这有可能吗?

表名:

Variable
Value
Variable_Value ( mapping table )

字段名称(在所有表中):

Variable_ID
Value_ID

下面的例子:

For example Variable_ID 5 only has Value_ID 10 assigned to it. 
If a user selects a Variable_ID, he sees all assigned Value_IDs 
and is able to select one and try to delete it. So, a user could click 
on Variable_ID 3 and try to delete Value_ID 10. That shouldn't 
be possible if that specific Value_ID is the only assigned 
value to any other Variable, because that would leave that 
variable with no Value_IDs.

4

3 回答 3

1

通过分解您的要求,我认为您需要的逻辑是这样的:

  1. 首先获取VariableId特定的 s ValueId

    DECLARE @VALUE_ID INT
    SET @VALUE_ID = 10;
    
    SELECT DISTINCT VariableId
    FROM VARIABLE_VALUE
    WHERE ValueId = @VALUE_ID
    
  2. 在此查询之后,您将拥有VariableId具有该特定值的所有 s。然后,对于这些VariableIds 中的每一个,您需要COUNT它们具有的值的数量。

    SELECT VariableId, COUNT(ValueId) as Values
    FROM VARIABLE_VALUE
    WHERE VariableId IN (--- The result of the query in step 1 ---)
    GROUP BY VariableId
    
  3. 如果甚至有一个 VariableId计数返回 1,则您无法继续删除。

附言。我不知道 SQL 是否有效,我只是想提出我的答案背后的总体思路。

于 2012-11-05T13:21:23.147 回答
0

这应该这样做:

DECLARE @Value INT -- the right datatype here
DECLARE @VariableId INT -- the right datatype here
SET @Value = 10
SET @VariableId = 1

;WITH CTE AS
(
    SELECT  *, COUNT(*) OVER() Total,
            COUNT(CASE WHEN Value = @Value THEN 1 END) OVER() TotalValue
    FROM Variable_Value
    WHERE VariableId = @VariableId
)
DELETE FROM CTE
WHERE Total = TotalValue
于 2012-11-05T12:42:42.430 回答
0

好吧,也许我的问题更好。

如果有任何变量只分配了这个特定的值,让我们只关注语句。

因此,您需要查询所有变量,(1) 使用此值,(2) 是唯一的值。

SELECT AA.Variable_ID
FROM Variable_Value AA
  LEFT OUTER JOIN Variable_Value BB
    ON AA.Value_ID = ? AND AA.Variable_ID = BB.Variable_ID AND BB.Value_ID <> ?
GROUP BY AA.Variable_ID

这些是可以删除的变量。

于 2012-11-05T14:33:46.100 回答