如何从2个表根据唯一值的列在一个表

问题描述:

我有2个表选择: 一(案件) 二(评论)如何从2个表根据唯一值的列在一个表

在一对多的关系;我将每个案例的评论存储在评论表中。

,我需要选择从在评论表呈现案件表情况的信息,但我想可以通过添加注释日期(CDATE)

显示一次订购的每个情况下,我尝试:

SELECT TOP 10 
    Cases.*, 
    comments.cDate 
FROM 
    Cases 
INNER JOIN comments 
    ON Cases.Case_ID = comments.Case_ID 
WHERE comments.Case_ID IN 
     (
      SELECT DISTINCT 
       Case_ID 
      FROM 
      comments 
     ) 
ORDER BY cDate DESC 

但它多次检索该案例,如果它有很多评论。我需要它出现一次只能


谢谢大家,你们很多帮助,, 我只是说

Cases.Case_ID IN (SELECT Case_ID FROM comments) 

它完美地工作。

Select语句是现在这个样子:

SELECT top 10 Cases.*, 
(SELECT MAX(comments.cDate) 
     FROM comments 
     WHERE Cases.Case_ID = comments.Case_ID ) AS cDate 
FROM Cases 
WHERE Cases.Case_ID 
       IN (SELECT Case_ID FROM comments) 
ORDER BY cDate DESC 

再次谢谢:)

+0

你想每箱最新评论? – Arion 2012-02-05 15:12:14

+0

是的,我需要得到最近讨论的案例 – Meensat 2012-02-05 20:34:50

谢谢大家,你们很多帮助,,我只是说

Cases.Case_ID IN (SELECT Case_ID FROM comments) 

它完美地工作。

Select语句是现在这个样子:

SELECT top 10 Cases.*, 
(SELECT MAX(comments.cDate) 
     FROM comments 
     WHERE Cases.Case_ID = comments.Case_ID ) AS cDate 
FROM Cases 
WHERE Cases.Case_ID 
       IN (SELECT Case_ID FROM comments) 
ORDER BY cDate DESC 

再次感谢:)

+0

至少,您可以对所有帮助您达到此解决方案的答案进行回复。谢谢。 – Kev 2012-03-04 08:54:56

在这种情况下,它看起来像你想使用子查询:

SELECT top 10 Cases.*, 
(SELECT MAX(comments.cDate) FROM comments 
      WHERE Cases.Case_ID = comments.Case_ID) AS cDate 
FROM Cases 
ORDER BY cDate DESC  
+0

[@Tomek](http://*.com/a/9150379/57237)正确地指出,这将返回没有任何意见的案件(这是OP的一项要求)。他将INNER JOIN添加到纠正该问题的评论中。 – yhw42 2012-02-05 15:45:55

+0

感谢您的回放,这是行之有效的,并检索独特的案件,但即使没有评论的案件被检索,我怎么能排除他们? – Meensat 2012-02-05 18:50:26

这将做:

SELECT TOP 10 
     A.* , 
     (SELECT MAX(C.cDate) FROM comments C WHERE C.Case_ID = A.Case_ID) commDate 
FROM Cases A 
     INNER JOIN comments B ON A.Case_ID = B.Case_ID 
ORDER BY commDate 

(@ yhw42查询将返回它们没有什么意见,以及案件。)

+0

你是对的!感谢您指出了这一点。 – yhw42 2012-02-05 15:48:17

+0

如果它有多个评论,它仍会多次返回相同的案例 – Meensat 2012-02-05 16:58:20

首先是一些测试数据:

DECLARE @tblCases TABLE(Case_ID INT) 
DECLARE @comments TABLE(Case_ID INT,cDate DATETIME) 

INSERT INTO @tblCases 
SELECT 1 UNION ALL SELECT 2 

INSERT INTO @comments 
SELECT 1,GETDATE() UNION ALL 
SELECT 1,GETDATE()-1 UNION ALL 
SELECT 2,GETDATE()-2 UNION ALL 
SELECT 2,GETDATE()-3 

话,我会做这样的。

;WITH CTE AS 
(
    SELECT 
     RANK() OVER(PARTITION BY Case_ID ORDER BY cDate DESC) AS iRank, 
     tbl.cDate, 
     tbl.Case_ID 
    FROM 
     @comments AS tbl 
) 
SELECT TOP 10 
    Cases.*, 
    CTE.cDate 
FROM 
    CTE 
    JOIN @tblCases AS Cases 
     ON Cases.Case_ID=CTE.Case_ID 
WHERE 
    CTE.iRank=1