查询帮助:如果是列复制,请将原始文件保留为select

时间:2009-11-10 21:02:18

标签: c# linq-to-sql

所以我有这个包含这些'资产'的表,有25个'特殊资产',用户无法编辑,因为它们是共享的。但是,作为一种允许用户编辑资产并拥有自己版本的方法,它会制作原始文件的副本,然后允许他们编辑。表中的行在复制后保存一个名为OriginalAssetID的值(否则为零)。现在挂起:我们不希望在浏览资产时为该用户显示原始资产。一旦他们制作原始资产的个人副本,只有新的个人副本才能显示两者。那么我怎样才能创建一个查询来获取所有这些资产,但是不能获得那些资产ID属于所选资产OriginalAssetID列的资产?请记住,我无法在原始资产本身上标记任何内容,因为它是由尚未复制但仍会在其浏览列表中看到的其他用户共享的。好运,我一直在努力为这个小时做好准备。

(SQL Server 2005)

添加一些例子:

资产一: asset_id = 5 orig_id = 0

资产二(是1的副本): asset_id = 12 orig_id = 5

因此,在这种情况下,我们只想取回资产二,不再取回资产一,因为它现在被复制,复制的版本应该是实时版本,但我们无法摆脱它,因为其他一些用户可能还没有复制它,因此对于他们来说,他们希望资产仍然是

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)