【问题标题】:In clause with 2 fields on 1 table在 1 个表上有 2 个字段的子句
【发布时间】:2012-01-13 06:46:30
【问题描述】:

我有一个问题:

 SELECT 
   MAX(date), 
   logId,
   computerId
 FROM 
   logTable
 WHERE logId IN ('1','2','3')

但我希望 IN 子句也像这样测试 computerId:

logId = '1' computerId = '998874',

logId = '2' computerId = '334211', ...

如何做到这一点?

【问题讨论】:

  • 是否有特定的配对,例如您的示例?操作系统如果 logid = '1' 那么 computerid 必须等于 '998874' 并且只有 '998874'?

标签: sql-server in-clause


【解决方案1】:

我认为你不能用IN 子句做到这一点。我认为你需要一个条件 where 。所以:

SELECT MAX(date), logId, computerId
FROM logTable
WHERE (logId = 1 AND computerId = '998874') OR
      (logId = 2 AND computerId = '334211') OR
      ...

【讨论】:

    【解决方案2】:

    SQL Server 中的IN 不支持元组。您可以使用EXISTS 和表表达式。 2008 语法如下。

    SELECT MAX(l.date),
           l.logId,
           l.computerId
    FROM   logTable l
    WHERE  EXISTS(SELECT *
                  FROM   (VALUES ( '1', '998874'),
                                  ('2', '334211')) v(logId, computerId)
                  WHERE  v.computerId = l.computerId
                         AND v.logId = l.logId)  
    GROUP  BY l.logId,
              l.computerId  
    

    【讨论】:

      【解决方案3】:

      像这样:

      SELECT 
         MAX(date), 
         logId,
         computerId
       FROM 
         logTable
       WHERE (logId = '1' AND computerId = '998874')
          OR (logId = '2' AND computerId = '334211')
          OR (logId = '3' AND computerId = '123456')
       GROUP BY logId, computerId
      

      【讨论】:

        【解决方案4】:

        您必须将INstatement 替换为多个ORstatements

         SELECT  MAX(date)
                ,  logId
                , computerId
         FROM   logTable
         WHERE  (logId = '1' AND computerid = '998874')
                OR (logId = '2' AND computerid = '334211')
        

        或者,如果您有很多条件,则为它们创建一个内存表并在这些条件上连接可能更具可读性

        ;WITH Conditions (logID, computerid) AS (
          SELECT '1', '998874'
          UNION ALL SELECT '2', '334211'
        )
        SELECT  MAX(date)
                ,  logId
                , computerId
        FROM   logTable lt
               INNER JOIN Conditions c ON c.logID = lt.LogID 
                                          AND c.computerid = lt.computerID
        

        【讨论】:

        • Doubtfull 但可以肯定的是,您必须比较这两个选项。请注意,这种特殊情况下的性能差异不会很明显。
        猜你喜欢
        • 2017-12-28
        • 1970-01-01
        • 2011-02-19
        • 1970-01-01
        • 2014-12-31
        • 2020-07-02
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多