我有一个查询:在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', ...
如何做到这一点?
我有一个查询:在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', ...
如何做到这一点?
你将不得不使用多个替换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
是比第一种更高性能的第二种方式吗? – Florian
不确定,但可以肯定的是,你必须比较两个选项。请注意,这种特殊情况下的性能差异并不明显。 –
我不认为你可以用IN
条款做到这一点。我认为你需要一个有条件的地方。因此:
SELECT MAX(date), logId, computerId
FROM logTable
WHERE (logId = 1 AND computerId = '998874') OR
(logId = 2 AND computerId = '334211') OR
...
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
像这样:
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
是否有特定的对,就像你的例子? OS如果logid ='1',那么computerid必须等于'998874'并且仅'998874'? – Maess