我甚至不知道如何开始搜索这个。
让我解释一下我要做的事情:
我有一个变量值映射表。 可以为变量分配多个值,并且可以将相同的值分配给多个变量。
用户可以删除变量/值。 但是,如果存在仅为其指定了此特定值的变量,则不应允许删除值。否则变量将保持未删除状态,但分配了0值,这是错误的。
现在,在用户尝试从特定变量中删除值时,我想检查:
对于所选valueID的IF,有任何只分配了一个valueID的variableID,并且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.
答案 0 :(得分:1)
通过打破你的要求,我认为你需要的逻辑是这样的:
首先获取特定VariableId
的{{1}}:
ValueId
在此查询之后,您将拥有具有该特定值的所有DECLARE @VALUE_ID INT
SET @VALUE_ID = 10;
SELECT DISTINCT VariableId
FROM VARIABLE_VALUE
WHERE ValueId = @VALUE_ID
。然后,对于这些VariableId
的每个,,您需要VariableId
他们拥有的值的数量。
COUNT
如果甚至一个 SELECT VariableId, COUNT(ValueId) as Values
FROM VARIABLE_VALUE
WHERE VariableId IN (--- The result of the query in step 1 ---)
GROUP BY VariableId
的计数返回1,那么 继续删除。
聚苯乙烯。我不知道SQL是否有效,我只是想提出我的答案背后的一般想法。
答案 1 :(得分: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
答案 2 :(得分: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
这些是可以删除的变量。