2016-06-28 93 views
0

我有一張表格,可以爲每場比賽選擇20名球員中的11名球員(根據他們的位置)。我所做的是創建一個稱爲「FixturePlayer」的新表,以便將PlayerID和FixtureID存儲到表中。如何從CTE中插入表格

但我不知道如何將pl.PlayerID和pl.FixtureID插入到'PlayerFixture'表中,因爲我已經調用了select。我該怎麼辦?

WITH pl AS (SELECT DISTINCT p.PlayerID 
          ,p.Position 
          ,CASE WHEN p.TeamID = 0 THEN 0 
           ELSE p.playerWeighting END AS playerWeighting 
          ,ABS(CHECKSUM(NewID())) % 10 + 1 AS Form 
          ,t.TeamID 
      FROM dbo.Fixture f 
      INNER JOIN dbo.League l ON f.LeagueID = l.LeagueID 
      INNER JOIN dbo.Team t ON l.LeagueID = t.LeagueID 
      INNER JOIN dbo.Player p ON t.TeamID = p.TeamID 
      WHERE f.WeekNumber = 1) 
,po AS (SELECT *, ROW_NUMBER() OVER(PARTITION BY pl.TeamID, pl.Position ORDER BY NEWID()) AS Rnk FROM pl) 
,total AS (SELECT TeamID 
      ,SUM(playerWeighting) AS TeamWeight 
      ,SUM((playerWeighting/10) * Form + playerWeighting) AS FinalTeamWeight 
     FROM po 
     WHERE (po.Position = 'GK' and po.rnk = 1) OR 
      (po.Position = 'DF' and po.rnk <= 4) OR 
      (po.Position = 'MF' and po.rnk <= 4) OR 
      (po.Position = 'FW' and po.rnk <= 2) 
     GROUP BY po.TeamID 

CREATE PROCEDURE [dbo].[MatchDay_Insert] 

AS 
SET NOCOUNT ON 
BEGIN 

    SELECT [TeamID], [TeamWeight], [Form], [FinalTeamWeight] 
    FROM TeamWeighting 
    ORDER BY TeamID 


    select * from player 
END 

PlayerFixture:

CREATE TABLE [dbo].[PlayerFixture] 
(
    [FixtureID] INT NOT NULL PRIMARY KEY, 
    [PlayerID] INT NULL 
) 
+0

提供PlayerFixture表的DDL,根據上面的示例數據插入哪些數據。 –

+0

我已經改變了這個問題,並且包含了PlayerFixture表的模式 –

回答

0

的問題是稍微不鮮明,但我想你實際上是想知道如何使用相同的cte兩次?一次用於將數據插入dbo.PlayerFixture,一次用於選擇數據?

的方式,我總是做,這是一個臨時表

IF OBJECT_ID('tempdb..#TblName') IS NOT NULL 
    BEGIN 
     DROP TABLE #TblName 
    END 

;WITH cte AS (
....cte definition 
) 

INSERT INTO #TblName (Col1,....) 
SELECT 
    Col1 
FROM 
    cte 

INSERT INTO dbo.PlayerFixture (FixtureId, PlayerId) 
SELECT 
    FixtureId 
    ,PlayerId 
FROM 
    #TblName 

SELECT * 
FROM 
    #TblName 

如果你在那裏只是意味着你是怎麼得到的數據TEH 3 CTE的你在上面簡單地定義你的CTE定義後直接寫INSERT INTO dbo.PlayerFixture SELECT儘管這看起來不像你想從cte自己得到的東西。

+0

對不清楚的問題抱歉。實際上,我的意思是我選擇的代碼有11個玩家,我想將這些玩家的PlayerID'和'FixtureID'插入表'PlayerFixture'表中。唯一的問題是,我已經有一個SELECT語句,所以不知道如何解決這個問題 –

+0

還有你建議的代碼,我把它放在proc或視圖? –

+0

它不會在視圖中工作,因爲您正在創建臨時表。你可以將臨時錶轉換爲一個表變量,並在一個表值函數中完成,它本質上就像一個視圖。或者你可以在存儲過程中做到這一點。但是,如果你想兩次使用cte結果,你將不得不創建某種形式的臨時持有cte結果,然後在臨時表上執行操作。 – Matt