【问题标题】:How do I select values of different ForeignKeyIDs of the same table?如何选择同一张表的不同 ForeignKeyID 的值?
【发布时间】:2015-12-10 08:57:25
【问题描述】:

我做msSql已经有一段时间了,有谁能提醒我如何选择不同ForeignKeyID的值?

我想要的是当 ForeignKeyID 为 1 时选择大于 10 的值;那么我想在 ForeignKeyID 为 2 时选择大于 20 的值;当 ForeignKeyID 为 3 时,值大于 30,依此类推...

我知道以下执行不起作用,因为我得到一个空的结果,而我在我的表(填充了数千条记录)中看到我之前提到的条件存在。

SELECT [ForeignKeyID]
      ,[Value]
  FROM [tblMyTable]
  where (ForeignKeyID = 1 and Value > 10) and (ForeignKeyID = 2 and Value > 20) and (ForeignKeyID = 3 and Value > 30)

我认为我没有正确放置括号?

【问题讨论】:

    标签: sql sql-server sql-server-2008 select


    【解决方案1】:

    我创建了一个示例表并进行了一个通用查询,该查询将根据 ForiegnKeyID 和 Value 附加 Where 类:)

    Create table Mytemp
    (
    ForeignKeyID int,
    [Value] int
    )
    
    Insert into Mytemp values (1,10)
    Insert into Mytemp values (2,20)
    Insert into Mytemp values (3,30)
    Insert into Mytemp values (4,40)
    Insert into Mytemp values (5,50)
    Insert into Mytemp values (6,60)
    Insert into Mytemp values (7,70)
    Insert into Mytemp values (8,80)
    
    
    DECLARE @value INT
    Declare @FKey INT
    
    Declare @SQL varchar(max)
    Declare @Where varchar(max)
    
    Set @Where=''
    
    set @SQL='SELECT [ForeignKeyID] ,[Value] FROM Mytemp'
    
    
    DECLARE @db_cursor CURSOR
    SET @db_cursor = CURSOR FOR SELECT [ForeignKeyID] ,[Value] FROM Mytemp
    OPEN @db_cursor
    FETCH NEXT
    FROM @db_cursor INTO @FKey, @value
    WHILE @@FETCH_STATUS = 0
    BEGIN
        If @Where=''
            set @Where='(ForeignKeyID = '+Convert(varchar,@FKey) +' AND Value > '+Convert(varchar,@value) +')'
        Else
            set @Where=@Where+ ' OR '  +'(ForeignKeyID = '+Convert(varchar,@FKey) +' AND Value > '+Convert(varchar,@value) +')'
    
    
    
    FETCH NEXT
    FROM @db_cursor INTO @FKey, @value
    END
    CLOSE @db_cursor
    DEALLOCATE @db_cursor
    
    
    set @SQL=@SQL+' Where ' + @Where
    Print (@SQL)
    Exec (@SQL)
    
    Drop table Mytemp
    

    【讨论】:

    • 我忘了添加结果查询,它会使用上面提到的查询生成器自动生成下面的查询,然后你可以执行它。它将根据 value 和 foreignkeyid 自动附加条件。 SELECT [ForeignKeyID] ,[Value] FROM Mytemp Where (ForeignKeyID = 1 AND Value > 10) OR (ForeignKeyID = 2 AND Value > 20) OR (ForeignKeyID = 3 AND Value > 30) OR (ForeignKeyID = 4 AND Value > 40) OR (ForeignKeyID = 5 AND Value > 50) OR (ForeignKeyID = 6 AND Value > 60) OR (ForeignKeyID = 7 AND Value > 70) OR (ForeignKeyID = 8 AND Value > 80)
    【解决方案2】:

    您使用了错误的逻辑运算符。大括号中每对条件的关系应该是or,而不是and

    SELECT [ForeignKeyID]
          ,[Value]
      FROM [tblMyTable]
     WHERE (ForeignKeyID = 1 AND Value > 10) OR
           (ForeignKeyID = 2 AND Value > 20) OR
           (ForeignKeyID = 3 AND Value > 30)
    

    请注意,可以通过一些数学技巧大大简化此条件:

    SELECT [ForeignKeyID]
          ,[Value]
      FROM [tblMyTable]
     WHERE ForeignKeyID IN (1, 2, 3) -- Or any other value you want to allow
           AND Value > (10 * ForeignKeyValue)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      相关资源
      最近更新 更多