您似乎有一些潜在的数据问题,必须解决这些问题才能找到正确的解决方案。更具体地说,如果 visit_table 有多个相同 ap_id 和 visit_type 的记录会发生什么?或者我们应该假设这两列上有一个唯一的键?
发布的这个问题的最佳答案实际上可能取决于您使用的 SQL 的风格以及您真正尝试做的事情的细微差别。例如,PostgreSQL 能够“SELECT DISTINCT ON”列而不需要分组。 Oracle、SQL Server 等有能力simplify complex queries using the with clause。如果其他方法失败,您可以随时编写嵌套查询来尝试在一个怪物查询中获取所有内容。
如果您能够使用temp table 或table variable,您最好根据需要将信息选择到构造表中。如果您需要超过 3 次访问,您可能需要写信 dynamic sql。如果您希望这些信息随时可供其他查询访问,您可以考虑将其写为view。
关于简单地为您的查询选择 min(visit_id) 和 min(username) 的快速说明 - 如果您有多个分组的行,您可能会从一次访问中获取 id 与另一次访问中的用户名不正确地配对。
这里尝试为包括的 3 种访问类型创建一个怪物查询:
SELECT a.ap_id,
a.location,
v1.visit_id AS first_visit_id,
v1.username AS first_visit_username,
v2.visit_id AS second_visit_id,
v2.username AS second_visit_username,
v3.visit_id AS third_visit_id,
v3.username AS third_visit_username
FROM (
SELECT ai.ap_id,
(SELECT MIN(v1i.visit_id) FROM visit_table v1i ON v1i.ap_id = ai.ap_id AND v1i.type = 'first') AS v1_id,
(SELECT MIN(v2i.visit_id) FROM visit_table v2i ON v2i.ap_id = ai.ap_id AND v2i.type = 'second') AS v2_id,
(SELECT MIN(v3i.visit_id) FROM visit_table v3i ON v3i.ap_id = ai.ap_id AND v3i.type = 'third') AS v3_id
FROM ap_table ai
) x
JOIN ap_table a ON x.ap_id = a.ap_id
LEFT JOIN visit_table v1 ON x.v1_id = v1.visit_id
LEFT JOIN visit_table v3 ON x.v2_id = v2.visit_id
LEFT JOIN visit_table v3 ON x.v3_id = v3.visit_id
WHERE
x.v1_id IS NOT NULL
OR x.v2_id IS NOT NULL
OR x.v3_id IS NOT NULL