所以我有这个包含这些'资产'的表,有25个'特殊资产',用户无法编辑,因为它们是共享的。但是,作为一种允许用户编辑资产并拥有自己版本的方法,它会制作原始文件的副本,然后允许他们编辑。表中的行在复制后保存一个名为OriginalAssetID的值(否则为零)。现在挂起:我们不希望在浏览资产时为该用户显示原始资产。一旦他们制作原始资产的个人副本,只有新的个人副本才能显示两者。那么我怎样才能创建一个查询来获取所有这些资产,但是不能获得那些资产ID属于所选资产OriginalAssetID列的资产?请记住,我无法在原始资产本身上标记任何内容,因为它是由尚未复制但仍会在其浏览列表中看到的其他用户共享的。好运,我一直在努力为这个小时做好准备。
(SQL Server 2005)
添加一些例子:
资产一: asset_id = 5 orig_id = 0资产二(是1的副本): asset_id = 12 orig_id = 5
因此,在这种情况下,我们只想取回资产二,不再取回资产一,因为它现在被复制,复制的版本应该是实时版本,但我们无法摆脱它,因为其他一些用户可能还没有复制它,因此对于他们来说,他们希望资产仍然是
答案 0 :(得分:1)
怎么样
Select IsNull(p.AssetId, o.AssetId) AssetId,
IsNull(p.AssetName, o.AssetName) AssetName,
IsNull(p.AssetAge, o.AssetAge) AssetAge
-- etc.
From Assets o
Left Join Assets p
On p.OrigAssetId = o.AssetId
And p.userId = @MyUserId
在Select子句中,只需添加要输出的所有列...对于每一列,如果表中有特定于用户的行,则IsNull
将从该外连接表中输出值,如果没有,则每个IsNull
中的第一个参数将为空,并且所有IsNull
将从非用户特定行输出默认值...
答案 1 :(得分:1)
这是SQL,但您可以轻松将其翻译为Linq。
SELECT *
FROM Assets
WHERE user_id = @user_id
UNION ALL
SELECT * FROM Assets
WHERE
original_asset_id = 0
and asset_id NOT IN
(SELECT original_asset_id FROM Assets WHERE user_id = @user_id)
第一个选择返回用户覆盖的所有资产。第二个选择返回未被用户覆盖的所有资产。
答案 2 :(得分:0)
这尚未经过测试,但我相信它会起作用。
SELECT * FROM Assets WHERE user_id = 99 AND asset_id NOT IN
(SELECT original_asset_id FROM Assets WHERE user_id = 99 AND original_asset_id <> 0)
为了澄清,我正在描绘下表结构:
Assets
------
asset_id (PK)
user_id
original_asset_id (FK)
答案 3 :(得分:0)
这应该在linq中执行:
var assets = new object[]{}; //your assets enumerable
var userAsserts = (from asset in assets
select new {Id = asset.OriginalAssetID == 0 ? asset.ID : asset.OriginalAssetID, Asset= asset).OrderByDescending(a => a.OriginalAssetID).Distinct(a => a.Id);
答案 4 :(得分:0)
我相信'不存在'会在这种情况下起作用:
select asset_id
from assets a
where not exists (select * from assets where orig_asset_id = a.asset_id)