SQL两个表之间的引用?

时间:2013-08-15 00:50:27

标签: sql

我有两个表,我试图计算特定'ID'出现的次数,然后输出一个与'id'对应的名称。例如,列表中的某些人有多个ID,我想输出ID超过4次的人。

感谢bvr,我有一部分,我现在知道如何使用以下语句显示超过4次的值:

SELECT ID , COUNT(OrderID) FROM Table1
GROUP BY ID
HAVING COUNT(OrderID) > 4

只需要第二部分。

以下是两个表的示例。

表1

ID | OrderID
--------------
191 | 1020
150 | 1090
191 | 1023
140 | 1033
191 | 2132
191 | 1233
191 | 1321

表2

ID | FirstName
--------------
191 | Mat
150 | Stewart
191 | Mat
140 | John
191 | Mat
191 | Mat
191 | Mat

我想输出类似的东西

Occurrences  | FirstName 
-------------------------
         5   |  Mat

2 个答案:

答案 0 :(得分:1)

您想加入第二个表以获取名称:

SELECT t1.ID , COUNT(t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     (select id, min(name) as name
      from Table2 t2
      group by id
     ) t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(t1.OrderID) > 4;

在进行连接之前,您需要按id进行聚合,以确保没有重复项。子查询获得id上的最小名称。如果所有名称都相同,那么这就是名称。否则,它是分配给id的任意名称。

编辑:

你可以在没有子查询的情况下进行查询,但我不确定它会更有效:

SELECT t1.ID , COUNT(distinct t1.OrderID), min(t2.name) as name
FROM Table1 t1 join
     Table2 t2
     on t1.id = t2.id
GROUP BY t1.ID
HAVING COUNT(distinct t1.OrderID) > 4;

这可能看起来更简单,但在性能方面可能会更糟。例如,如果一个id在表1和表2中都有1000个匹配,那么该id最终会在连接后处理1,000,000行。

答案 1 :(得分:0)

DISTINCT

的版本
SELECT t2.FirstName, COUNT(*) Occurrences 
  FROM Table1 t1 JOIN 
(
  SELECT DISTINCT id, firstname
    FROM Table2
) t2
    ON t1.ID = t2.ID
 GROUP BY t2.ID, t2.FirstName
 HAVING COUNT(*) > 4

输出:

| FIRSTNAME | OCCURRENCES |
---------------------------
|       Mat |           5 |

这是 SQLFiddle 演示

相关问题