Sql server SQL Server如何选择第二个结果集与第一个结果集重叠的两个结果集

Sql server SQL Server如何选择第二个结果集与第一个结果集重叠的两个结果集,sql-server,tsql,Sql Server,Tsql,首先,我为冗长而有些混乱的标题道歉,请允许我详细说明 我有一家在线商店,出售生日卡、圣诞节卡等。目前,它提供用户可以选择的默认卡 我计划让用户修改现有的卡片,改变它的布局、文本、颜色等。但我想保留默认的卡片,并记录修改来自哪个卡片。这部分我想我已经弄明白了 我的目标是让网站向用户显示所有默认卡,但显示用户自己的替换卡,以取代默认卡 考虑到这一点,我的数据库表具有以下部分布局: Table: Cards UserId int CardId int CardText int 假设默认卡存储

首先,我为冗长而有些混乱的标题道歉,请允许我详细说明

我有一家在线商店,出售生日卡、圣诞节卡等。目前,它提供用户可以选择的默认卡

我计划让用户修改现有的卡片,改变它的布局、文本、颜色等。但我想保留默认的卡片,并记录修改来自哪个卡片。这部分我想我已经弄明白了

我的目标是让网站向用户显示所有默认卡,但显示用户自己的替换卡,以取代默认卡

考虑到这一点,我的数据库表具有以下部分布局:

Table: Cards
UserId   int
CardId   int
CardText int
假设默认卡存储在UserId 1下,新用户为UserId 2,上表的记录如下所示:

UserId CardId CardText
  1      1    Valentines
  1      2    Birthday
  1      3    Merry Xmas
  2      1    Be my valentine
如您所见,用户2修改了卡片1,将文本从情人节改为“我的情人节”,并且用户1的原始卡片1仍可供未来用户使用

我希望显示所有默认卡,但显示用户替换卡以代替其默认对应卡

这意味着UserId 1将看到:

CardId 1 [UserId #1]
CardId 2 [UserId #1]
CardId 3 [UserId #1]
CardId 1 [UserId #2]  <-
CardId 2 [UserId #1]
CardId 3 [UserId #1]
用户ID 2将看到:

CardId 1 [UserId #1]
CardId 2 [UserId #1]
CardId 3 [UserId #1]
CardId 1 [UserId #2]  <-
CardId 2 [UserId #1]
CardId 3 [UserId #1]
这将返回默认卡以及用户2修改的卡

我的问题是,有没有更有效的方法?我对上述代码的问题是一段SQL代码正在运行两次选择。。。其中UserId=2,这对我来说效率很低

我已经研究了其他集合运算符,但没有成功地实现相交,除了我甚至想到使用合并运算符没有任何效果


感谢您提供的帮助。

您可以使用CTE和ROW_NUMBER功能,通过具有相同CardID的记录为记录组分配一个具有优先级的行号,然后仅选择具有最高优先级=1的记录:

WITH cte AS 
(
    SELECT
        CardID,
        UserID,
        CardText,
        priority = ROW_NUMBER() OVER (PARTITION BY CardID ORDER BY UserID DESC)
    FROM
        dbo.Cards
    WHERE
        UserID IN (1,2)  -- filter by UserIDs of a user (UserID=2 in this example) and a "dummy user" that holds default values (UserID=1)
)

SELECT * FROM cte WHERE priority=1 

编辑:假设虚拟用户的UserID始终低于实际用户的UserID,例如,虚拟用户的UserID为1,实际UserID>1。

SQL数据没有任何顺序,只有order by子句指定的顺序。您点的是什么?使用指向原始卡且任何原始卡都为空的父卡ID来解决如何?这太完美了!正是我想要的,先生,你是上帝!