如何从一个表中获取记录,而另一个表中的ID不匹配

时间:2019-02-13 15:01:16

标签: sql sql-server

首先,我想对我重复的内容感到抱歉,我真的没有找到任何可以帮助我的东西。我对真正的SQL开发还很陌生,所以如果有人甚至可以向我指出一些资源,我将非常感谢。

问题:

我不确定如何处理问题,我怀疑需要 public CaseDetailsViewModel(INavigation navigation) { IGetDataFromServer cases = new GetDataFromServer(); Navigation = navigation; GetCases = cases.GetCases().FirstOrDefault(); } public CasesFull GetCases { get; set; } UNION

摘要:

表1:user1所查看文章的历史记录(1列带有文章ID)

表2:user2所查看文章的历史记录(1列带有文章ID)

表3:文章(更多列具有ID)

现在,我希望在LEFT OUTER JOINUNION历史之间找到一个user1,并获取尚未看到但仅限于10的文章ID。

伪代码:

user2

预期结果是在联合表中找不到的商品ID列表。还有其他更好的方法吗?子查询或过程?

3 个答案:

答案 0 :(得分:3)

您需要LEFT OUTER JOINUNION结果集,但您也可以这样做:

WITH CTE AS (
     <UNION Query here>
)
SELECT TOP (10) a.*
FROM article a
WHERE NOT EXISTS (SELECT 1 FROM CTE c WHERE c.ID = a.ID);

您可以使用OUTER JOIN进行过滤:

SELECT TOP (10) a.*
FROM article a LEFT OUTER JOIN
     CTE c 
     ON c.id = a.id
WHERE c.id IS NULL;

答案 1 :(得分:0)

您还可以使用子查询

select * from articles a
where a.id not in (
    select u.id from UnionTable u
)

但我更喜欢左联接

select * from articles a
left join UnionTable u on u.id=a.id
where u.id is null

答案 2 :(得分:0)

我会这样写:

SELECT TOP (10) a.*
FROM article a
WHERE NOT EXISTS (SELECT 1 FROM user1 v WHERE v.ID = a.ID) AND
      NOT EXISTS (SELECT 1 FROM user2 v WHERE v.ID = a.ID) ;

这可以利用user1(id)user2(id)上的索引。

不过,更重要的是,您应该修复数据模型。您应该有一个表userArticles,其中包含以下信息:

create table userArticles (
    userArticleId int identity(1, 1) primary key,
    userId int references users(userId),
    articleId int references articles(articleId),
    viewDateTime datetime default getdate()
);

通过多个表传播诸如视图之类的信息不是一个好主意。