2016-06-28 3 views
0

각 경기에서 20 명 중 11 명 (위치에 따라)을 선택하는 테이블이 있습니다. 필자가 한 일은 PlayerID와 FixtureID를 테이블에 저장하는 'FixturePlayer'라는 새로운 테이블을 만든 것입니다.CTE에서 테이블에 삽입하는 방법

그러나 내가 이미 select를 호출 중이므로 'PlayerFixture'테이블에 pl.PlayerID와 pl.FixtureID를 어떻게 삽입 할 수 있는지 잘 모르겠습니다. 어떻게해야합니까?

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

관련 문제