加入两个查询

时间:2012-06-18 04:23:26

标签: sql sql-server

我有两个选择要在我的项目中使用的查询来获取数据并在我的网页中显示它。我想加入它们,所以我只需要访问一次数据。但我不知道如何加入它们作为查询之一包含组功能。你可以帮帮我吗?提前致谢。

1 个答案:

答案 0 :(得分:1)

解决这个问题的一种方法是分几步完成工作。在将结果集加入查询之前,您需要将其保存在临时表或表变量中。 (如果您期望大的结果集,则可能更喜欢临时表。)

基本上,您的查询将更改为以下内容:

/* prepare the storage */
IF OBJECT_ID('tempdb..#sp_results') IS NOT NULL
  DROP TABLE #sp_results;
CREATE TABLE #sp_results (
  /* the types may be wrong, please modify as necessary */
  currency_cd int,
  salary decimal(10,2)
);

/* save the results of the SP */
INSERT INTO #sp_results
EXEC SP_name arguments…

/* use the saved results in your query */
SELECT
  your present columns,
  tmp.currency_cd,
  tmp.salary
FROM
  your present joins
  LEFT OUTER JOIN #sp_results AS tmp ON a proper join condition
;

问题是,您的SP旨在返回个人员工的结果,而查询似乎正在检索多个员工的数据。要解决此问题,您可以在临时表中添加employee_code列,并使用循环在游标中逐个获取/保存每个员工的结果。

但这可能是使用游标的最差示例之一。更好的选择可能是创建一个视图,返回与SP相同的数据,但对于所有员工:

CREATE VIEW employees_compensation_view
AS
SELECT
  employee_code,
  currency_cd,
  SUM(comprate) AS salary
FROM employees_compensation
GROUP BY
  employee_code,
  currency_cd

然后您就可以将视图加入到查询中,如下所示:

SELECT
  your present columns,
  ecv.currency_cd,
  ecv.salary
FROM
  your present joins
  LEFT OUTER JOIN employees_compensation_view AS ecv
    ON b.employee_code = ecv.employee_code
;

为了更好地封装业务逻辑,您还可以更改存储过程查询,如下所示:

SELECT
  currency_cd,
  salary
FROM employees_compensation_view
WHERE employee_code = @emp_code

也就是说,如果你仍然需要那个SP。