2014-06-09 38 views
0

我有一個查詢用於抽取一些數據,但是當我加入另一個表時,它將爲其它表中已加入的每個記錄重複我的結果。TSQL select子句包含比需要更多的數據

我敢肯定這是一個簡單的問題,我忽略但似乎無法得到它。

我的查詢是在這裏:

SELECT A.[id], 
      A.[subject], 
      A.[description], 
      CONVERT(VARCHAR(17), A.[startTime], 100) as startTime, 
      CONVERT(VARCHAR(17), A.[endTime], 100) as endTime, 
      A.[whoCreated], 
      A.[center], 
      B.[FirstName], 
      B.[LastName], 
      B.[ntid] as empNTID, 
      C.[centerName], 
      D.[employee], 
      E.[segmentID] 
    FROM Focus_Meetings AS A 
    JOIN empTable as B 
    ON A.[whoCreated] = B.[empID] 
    JOIN Focus_Centers as C 
    ON A.[center] = C.[id] 
    JOIN Focus_Attendees as D 
    ON D.[meetingID] = A.[id] 
    JOIN Focus_Meetings_Segments as E 
    ON E.[meetingID] = A.[id] 
    WHERE 

     (CAST(A.startTime AS DATE) = CAST(COALESCE(@meetingDate, A.startTime) AS DATE) OR 
     CAST(A.endTime AS DATE) = CAST(COALESCE(@meetingDate, A.endTime) AS DATE) OR 
     (E.[segmentID] IN(SELECT ParamValues.x2.value('segment[1]', 'INT') 
          FROM @meetingSegment.nodes('/segments/theSegment') AS ParamValues(x2)) 
          ) 
     ) 
    FOR XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root'); 

有1個紀錄在Focus_Meetings表和5個記錄在Focus_Meetings_Segments

我的結果應該只是一次會議,但它會給出每個D.[employee]E.[segmentID]的記錄。

我想這就是它應該如何處理我的查詢,但這不是我的意圖。

有附加到會議中Focus_Meetings_Segments 5段,當我搜索他們中的一個,它應該只通過展示我開會1次,一次也沒有爲每個段。

回答

0

你是對的,這就是你的查詢應該如何工作。這是一個常見的問題,許多剛接觸JOINS的人遇到。

實質上,您目前正在要求SQL Server根據您的JOINS返回每組數據,這就是它正在做的事情。這聽起來像你想要的是任意從結果集中刪除記錄。

考慮您的結果集的以下簡化版本:

Subject | Description | SegmentId 
----------------------------------------- 
Whatever | Some desc... | 1 
Whatever | Some desc... | 2 

根據您的描述,您只需要結果的Whatever | Some desc...部分顯示一個時間。

如果這是你想要做的,你有幾個選項。

  1. 停止選擇,導致該記錄 顯示兩次,並只選擇不同的記錄中的數據(SegmentId)。

    SELECT DISTINCT Subject, Description...

  2. 指定上導致記錄由各地展示兩次組數據的聚合函數。

    SELECT Subject, Description, MAX(SegmentId)... GROUP BY Subject, Description

你也應該評估正是你需要的選擇與你所選擇。如果您正在任意選擇SegmentId,那麼您可能首先不需要它。

+0

我想了解這個信息,所以我很抱歉,如果我的問題太明顯了。 「Focus_Meetings_Segments」表格包含'meetingID'和'segmentID'。我得到'E. [segmentID]'的原因是因爲在我的where子句中,我正在檢查提供的segmentID是否在該表中。也許有更好的方法來做到這一點? – SBB

+0

您不需要選擇一列以便在您的'WHERE'子句中使用它。另外 - 我指的是你的第一個select語句,而不是你的'WHERE ... IN'子句中的那個。 –

+0

好的,我會盡力從你的回覆中找出答案。這是我的表的圖片,如果它有幫助http://oi59.tinypic.com/2vwtvdx.jpg – SBB

0

當我搜索他們中的一個,應該只有我展示會議1次,一次也沒有爲每個段

然後採取SegmentEmployee出個emain查詢,做一個子查詢:

SELECT A.[id], 
     A.[subject], 
     A.[description], 
     CONVERT(VARCHAR(17), A.[startTime], 100) as startTime, 
     CONVERT(VARCHAR(17), A.[endTime], 100) as endTime, 
     A.[whoCreated], 
     A.[center], 
     B.[FirstName], 
     B.[LastName], 
     B.[ntid] as empNTID, 
     C.[centerName] 
FROM Focus_Meetings AS A 
JOIN empTable as B 
ON A.[whoCreated] = B.[empID] 
JOIN Focus_Centers as C 
ON A.[center] = C.[id] 
WHERE A.[id] IN 
(
    SELECT E.[meetingID] 
    FROM Focus_Meetings_Segments as E 
    WHERE 
     (CAST(A.startTime AS DATE) = CAST(COALESCE(@meetingDate, A.startTime) AS DATE) OR 
     CAST(A.endTime AS DATE) = CAST(COALESCE(@meetingDate, A.endTime) AS DATE) OR 
     (E.[segmentID] IN(SELECT ParamValues.x2.value('segment[1]', 'INT') 
         FROM @meetingSegment.nodes('/segments/theSegment') AS ParamValues(x2)) 
         ) 
     ) 
) 
FOR XML PATH ('details'), TYPE, ELEMENTS, ROOT ('root');