我正在寻找一个模式或代码示例,用户可以在其中输入自己的记录,覆盖默认记录。
例如,Holiday表的默认记录可能是:
HolidayName Holiday Date CompanyId
----------- ------------ ---------
New Year 01-Jan-2016 NULL
Day After 02-Jan-2016 NULL
用户添加自己的假期后(对于CompanyId“1234”):
HolidayName Holiday Date CompanyId
----------- ------------ ---------
New Year 01-Jan-2016 NULL
Day After 02-Jan-2016 NULL
Another Name 01-Jan-2016 1234
My Holiday 03-Jan-2016 1234
Joes Holiday 04-Jan-2016 5678
如何检索以下组合的假日列表:
像companyId = 1234这样:
HolidayName Holiday Date CompanyId
----------- ------------ ---------
Another Name 01-Jan-2016 1234
Day After 02-Jan-2016 NULL
My Holiday 03-Jan-2016 1234
不确定这是否可以在SQL视图,Query或C#代码中完成。
答案 0 :(得分:1)
对于您的具体情况,您只需在日期进行完全加入(因为您只显示用户添加假期或重命名现有假期):
SELECT
COALESCE(User.HolidayName, Default.HolidayName) as HolidayName,
COALESCE(User.HolidayDate, Default.HolidayDate) as HolidayDate,
User.CompanyId
FROM Holidays as User
FULL OUTER JOIN (
SELECT * FROM Holidays WHERE CompanyId IS NULL
) as Default ON
User.HolidayDate = Default.HolidayDate
WHERE
User.CompanyId = 1234
但是,这并不允许用户删除假期。您可以通过创建带有IsDeleted
标志的用户假期来解决这个问题 - 但我个人可能会选择初始化复制程序,这种程序会更简单,更灵活。如果你推出新的"默认"它确实需要一些合并代码。未来的假期,但这非常微不足道。
答案 1 :(得分:1)
似乎如果你将数据标准化得更多一点,它会有很大的帮助:
Table: Company
CompanyId
---------
1234
5678
Table: CompanyHoliday
Id CompanyId HolidayId
------------------------------------
1 1234 3
2 1234 4
3 5678 5
Table: Holiday
Id OccursOn IsDefault Name
----------------------------------
1 01-01-2016 1 New Year
2 01-02-2016 1 Day After
3 01-01-2016 0 Another Name
4 01-03-2016 0 My Holiday
5 01-04-2016 0 Joes Holiday
然后提及Mark Brackett,当您创建新公司时,在CompanyHoliday表中为默认假期的新公司创建关联记录。