在映射表中获取包含值的所有相关行

时间:2012-11-05 12:30:53

标签: sql sql-server-2008

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

让我解释一下我要做的事情:

我有一个变量值映射表。 可以为变量分配多个值,并且可以将相同的值分配给多个变量

用户可以删除变量/值。 但是,如果存在仅为其指定了此特定值的变量,则不应允许删除值。否则变量将保持未删除状态,但分配了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.

3 个答案:

答案 0 :(得分:1)

通过打破你的要求,我认为你需要的逻辑是这样的:

  1. 首先获取特定VariableId的{​​{1}}:

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

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

    < / LI>

    聚苯乙烯。我不知道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

这些是可以删除的变量。