2011-12-05 104 views
2

我有一个查询:在1和表2场第

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

但我想IN子句测试computerId太像这样:

LOGID = '1' computerId = '998874',

LOGID = '2' computerId = '334211', ...

如何做到这一点?

+0

是否有特定的对,就像你的例子? OS如果logid ='1',那么computerid必须等于'998874'并且仅'998874'? – Maess

回答

2

你将不得不使用多个替换IN声明OR声明

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 
+0

是比第一种更高性能的第二种方式吗? – Florian

+0

不确定,但可以肯定的是,你必须比较两个选项。请注意,这种特殊情况下的性能差异并不明显。 –

1

我不认为你可以用IN条款做到这一点。我认为你需要一个有条件的地方。因此:

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

IN SQL Server不支持元组。您可以使用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 
0

像这样:

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 
相关问题