一个存储过程中有两个 SELECT 语句,一个为另一个提供输入,另一个返回多行

Sun*_*hew 3 sql t-sql sql-server

我有一个 select 语句,它从具有大量联接的查询中获取一次迭代的一行中的 4 个列值。必须将其中一个列值作为输入提供给另一个 select 语句以检查 where 条件。此 select 语句为第一个 select 语句的每次迭代的输入返回三行。我需要从第二个 select 语句的三行中获取所有列值以及第一个 select 语句的所有列值。

SELECT val1, val2, val3, val4 from ....

SELECT val5, val6 from anotherTable where someColumn = val1
Run Code Online (Sandbox Code Playgroud)

所需结果:

val1, val2, val3, val4, val51, val61, val52, val62, val53, val63
Run Code Online (Sandbox Code Playgroud)

我正在使用两个连接和两个阅读器来实现这一点,但它减慢了我的速度。如果我可以在单个存储过程中完成此操作,我希望如此。

pet*_*erm 5

你可以做这样的事情

WITH first AS 
(
  SELECT val1, val2, val3, val4
    FROM Table1
   WHERE 1 = 1
), second AS
(
  SELECT val1,
         MIN(CASE WHEN rnum = 1 THEN val5 END) val51,
         MIN(CASE WHEN rnum = 1 THEN val6 END) val61,
         MIN(CASE WHEN rnum = 2 THEN val5 END) val52,
         MIN(CASE WHEN rnum = 2 THEN val6 END) val62,
         MIN(CASE WHEN rnum = 3 THEN val5 END) val53,
         MIN(CASE WHEN rnum = 3 THEN val6 END) val63
    FROM
  (
    SELECT t2.val1, val5, val6, 
           ROW_NUMBER() OVER (PARTITION BY t2.val1 ORDER BY (SELECT 1)) rnum
      FROM Table2 t2 JOIN first f
        ON t2.val1 = f.val1
  ) a
   GROUP BY val1
)
SELECT * 
  FROM first f JOIN second s
    ON f.val1 = s.val1
Run Code Online (Sandbox Code Playgroud)

这是SQLFiddle演示