在查询同一个表中的对象时集成嵌套的SELECT查询?

时间:2016-06-23 02:13:26

标签: sql sql-server tsql relational-database

假设我有一个表Table1构造类似于下面,其中*是Key

ID*   GROUPID*    ATTR1      ATTR2  (...additional columns)
--    -------     -----      -----
1       100        45         89
2       100        37         27
3       101        69         19
4       102        37         22

给定ATTR1和ATTR2的一对值,我希望我的查询返回属于给定ATTR1和ATTR2的GROUPID的GroupID的所有行的列表。假设每对ATTR1和ATTR2将具有零个或一个GroupID。

有没有办法将此查询表示为没有嵌套查询(从而加快速度)?这是我到目前为止的查询:

SELECT [GROUPID], [ATTR1], [ATTR2]
FROM [TABLE1]
WHERE [GROUPID] = (
    SELECT TOP 1 GROUPID
    FROM [TABLE1]
    WHERE (ATTR1 = @attr1) and (ATTR2 = @attr2)
);

1 个答案:

答案 0 :(得分:1)

您的查询应该没问题。但是,您可以通过将子查询移动到FROM子句来保证子查询的一次执行:

SELECT t1.GROUPID, t1.ATTR1, t1.ATTR2
FROM TABLE1 t1 JOIN
     (SELECT TOP 1 GROUPID
      FROM [TABLE1]
      WHERE (ATTR1 = @attr1) and (ATTR2 = @attr2)
     ) tg
     ON t1.GROUPID = tg.GROUPID;

为了提高性能,您需要两个索引:TABLE1(ATTR1, ATTR2, GROUPID)TABLE1(GROUPID)