如何从sql中的两个表中获取不同的记录?

How to get distinct record from two tables in sql?

下面显示了两个 table

新闻(table姓名)

NewsId   NewsDate
1       25-03-2014

2       29-03-2014

newsImageGal(table 姓名)

newsSr   newsId      newsImages
1           1        images/i.jpg
2           1        images/j.jpg
3           1        images/k.jpg
4           2        images/l.jpg
5           2        images/m.jpg
6           2        images/n.jpg

我想要这样的结果

 NewsId   NewsDate          newsId      newsImages
  1        25-03-2014         1          images/i.jpg
  2        9-03-2014          2          images/l.jpg

我试过使用连接查询和分组功能,但它显示重复的多条记录如何解决这个查询?

你能试试这个吗

select distinct ng.newsId, ng.newsImages
from (
select MIN(newsSr),newsId,newsImages
from newsImageGal 
group by newsId,newsImages) ng
join news ne
on ne.newsId=ng.newsId
select n.NewsId,n.NewsDate,g.newsImages
from news n
join newsImageGal g on n.NewsId=g.newsSr

试试这个。

SELECT a.NewsId,
       a.NewsDate,
       b.newsImages
FROM   news  a
       JOIN (SELECT Row_number()OVER(partition BY newsid ORDER BY newssr) rn,
                    *
             FROM   newsImageGal) b
         ON a.NewsId = b.newsId
WHERE  rn = 1 

这里的关键是找到每个 newsid 添加到 newsImageGal table 中的第一张图像。 所以使用 window functionnewsSr 的顺序为每个 newsid 创建 Row_number。

SELECT Row_number()OVER(partition BY newsid ORDER BY newssr) rn,
                        *
FROM   newsImageGal

从上面的查询中您可以看到 rn=1 是第一个添加到 newsImageGal 中的图像 将结果与 news table 相结合并过滤结果rn=1

SELECT n.NewsId,
       n.NewsDate,
       ng.newsId,
       ng.newsimages
FROM   news n,
       (SELECT *,
               Rank()OVER(PARTITION BY newsId ORDER BY newsSr DESC) AS rank
        FROM   newsImageGal) ng
WHERE  n.NewsId = ng.newsId
       AND rank = 1 

你可以写成

;WITH CTE AS 
( SELECT N.NewsId
        ,N.NewsDate
        ,NIG.newsImages
        ,ROW_NUMBER() OVER (PARTITION BY  N.NewsId ORDER BY NIG.newsSr ASC)
        AS rownum
 FROM news N
 JOIN newsImageGal NIG ON N.NewsId = NIG.newsId
 )
SELECT NewsId,
       NewsDate,
       newsImages
FROM CTE
WHERE rownum = 1