我在JOINS上发了一篇很棒的帖子,What is the difference between "INNER JOIN" and "OUTER JOIN"?,但我认为这对我的问题没有帮助。
我想将两个select语句组合成一个select语句AND,使其对任何要查询的数据库都有效。
这就是我所拥有的
SELECT
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like '%Staten Island%'
AND dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%') AS 'Windows-SEP-11',
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like '%Staten Island%'
AND dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Windows%') AS 'Windows-SEP-12',
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like '%Staten Island%'
AND dbo.SEM_AGENT.AGENT_VERSION LIKE '11.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%') AS 'Mac-SEP-11',
(SELECT COUNT(*)
FROM dbo.sem_computer, [dbo].[V_SEM_COMPUTER], dbo.IDENTITY_MAP, dbo.SEM_CLIENT,dbo.SEM_AGENT,dbo.PATTERN
WHERE [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
AND dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
AND SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
AND dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
AND Name like '%Staten Island%'
AND dbo.SEM_AGENT.AGENT_VERSION LIKE '12.%'
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE 'Mac%') AS 'Mac-SEP-12'
如何缩小此SQL语句?即使我使用内部联接(我正在处理),这个语句是处理器密集型的(更不用说它看起来效率很低)
答案 0 :(得分:12)
您可以使用data: Array[5]
执行此操作。
还使用正确的Conditional Aggregate
语法来连接两个表而不是旧式逗号分隔连接。将过滤器保留在INNER JOIN
子句
Where
答案 1 :(得分:2)
在提供答案的基础上,我认为更优雅的解决方案是将过滤值保存在单独的表中(与数据分开的逻辑)。
但是,这只有在条件不相交时才会起作用(一对值最多会达到一个条件),否则多次"命中&#34>将计入更多选择。
INSERT INTO dbo.AgentAndOsFilter (AgentVersion, Os)
VALUES ('11.%', 'Windows%'), ('12.%', 'Windows%'), ('11.%', 'Mac%'), ('12.%', 'Mac%')
这可以使用您的过滤对填充:
SELECT F.Id, Count(1) Cnt
FROM dbo.sem_computer
INNER JOIN [dbo].[V_SEM_COMPUTER]
ON [dbo].[V_SEM_COMPUTER].COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.SEM_AGENT
ON SEM_COMPUTER.COMPUTER_ID = dbo.SEM_AGENT.COMPUTER_ID
INNER JOIN dbo.SEM_CLIENT
ON dbo.SEM_CLIENT.COMPUTER_ID = SEM_COMPUTER.COMPUTER_ID
INNER JOIN dbo.IDENTITY_MAP
ON dbo.SEM_CLIENT.GROUP_ID = IDENTITY_MAP.ID
INNER JOIN dbo.PATTERN
ON dbo.PATTERN.PATTERN_IDX = dbo.SEM_AGENT.PATTERN_IDX
INNER JOIN dbo.AgentAndOsFilter F
ON dbo.SEM_AGENT.AGENT_VERSION LIKE F.AgentVersion
AND dbo.SEM_COMPUTER.OPERATION_SYSTEM LIKE F.Os
WHERE Name LIKE '%Staten Island%'
GROUP BY F.Id
查询可能如下所示:
{{1}}
此解决方案的另一个优点是配置更改(代理的新版本,新操作系统)只是意味着更改表中的某些记录。