有效地选择真实记录或虚拟/默认记录;“记录”;在.NET/T-SQL中
我有一个结构来处理单个查询中加载的.NET数据集中的数据。我有一个表,用于覆盖应用程序驱动的默认值。要演示如何生成设置替代表,请执行以下操作:有效地选择真实记录或虚拟/默认记录;“记录”;在.NET/T-SQL中,.net,sql-server,tsql,.net,Sql Server,Tsql,我有一个结构来处理单个查询中加载的.NET数据集中的数据。我有一个表,用于覆盖应用程序驱动的默认值。要演示如何生成设置替代表,请执行以下操作: CREATE TABLE TABLE1( PK int IDENTITY(1,1) NOT NULL, VALINT int NOT NULL, DESCRIPTION1 varchar(50) NOT NULL ) 我的代码将生成具有内置默认值的SQL,并将自定义覆盖数据从表合并到查询中,然后返回单个数据集: SELECT C
CREATE TABLE TABLE1(
PK int IDENTITY(1,1) NOT NULL,
VALINT int NOT NULL,
DESCRIPTION1 varchar(50) NOT NULL
)
我的代码将生成具有内置默认值的SQL,并将自定义覆盖数据从表合并到查询中,然后返回单个数据集:
SELECT C.VALINT, C.DESCRIPTION1
FROM (
SELECT MAX(PK)AS PK, VALINT
FROM (
SELECT PK, VALINT
FROM TABLE1
UNION
SELECT 0, 1
UNION
SELECT 0, 2
) A
GROUP BY VALINT
)B, (
SELECT PK, VALINT, DESCRIPTION1
FROM TABLE1
UNION
SELECT 0, 1, 'Default1Val'
UNION
SELECT 0, 2, 'Default2Val'
) C
WHERE B.PK = C.PK AND B.VALINT = C.VALINT
对空表运行此查询,您将只看到查询中定义的两个默认设置。然后可以添加新的自定义替代:
INSERT INTO TABLE1(VALINT,DESCRIPTION1)VALUES(1,'CustomOverride1')
现在重新运行上述查询,您将看到表中的一个自定义值和剩余的一个未被覆盖的默认值。这个查询正是我所需要的,但是当这样做时,表中的数据将在两个不同的时间与默认设置数据联合。是否有一个更优雅的查询可以使用一组联合,或者我只能使用上面演示的两组完整的联合?您必须选择解决任务所需的方法。 Join用于组合来自不同表的列,union用于组合行 当您合并两个表时,对它们有几个要求
你必须选择你需要用什么来解决你的任务。 Join用于组合来自不同表的列,union用于组合行 当您合并两个表时,对它们有几个要求
这就是公共表表达式()非常有用的地方 我还更正了您的联接-不建议使用逗号分隔联接(旧式联接),而是使用显式联接类型
declare @TABLE1 table (
PK int IDENTITY(1,1) NOT NULL,
VALINT int NOT NULL,
DESCRIPTION1 varchar(50) NOT NULL
);
WITH cte AS (
SELECT PK, VALINT, DESCRIPTION1
FROM @TABLE1
UNION
SELECT 0, 1, 'Default1Val'
UNION
SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
SELECT MAX(PK)AS PK, VALINT
FROM cte A
GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;
返回:
VALINT DESCRIPTION1
1 Default1Val
2 Default2Val
添加自定义替代将提供:
INSERT INTO @TABLE1 (VALINT,DESCRIPTION1) VALUES(1,'CustomOverride1');
WITH cte AS (
SELECT PK, VALINT, DESCRIPTION1
FROM @TABLE1
UNION
SELECT 0, 1, 'Default1Val'
UNION
SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
SELECT MAX(PK)AS PK, VALINT
FROM cte A
GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;
返回:
VALINT DESCRIPTION1
2 Default2Val
1 CustomOverride1
这就是公共表表达式()非常有用的地方 我还更正了您的联接-不建议使用逗号分隔联接(旧式联接),而是使用显式联接类型
declare @TABLE1 table (
PK int IDENTITY(1,1) NOT NULL,
VALINT int NOT NULL,
DESCRIPTION1 varchar(50) NOT NULL
);
WITH cte AS (
SELECT PK, VALINT, DESCRIPTION1
FROM @TABLE1
UNION
SELECT 0, 1, 'Default1Val'
UNION
SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
SELECT MAX(PK)AS PK, VALINT
FROM cte A
GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;
返回:
VALINT DESCRIPTION1
1 Default1Val
2 Default2Val
添加自定义替代将提供:
INSERT INTO @TABLE1 (VALINT,DESCRIPTION1) VALUES(1,'CustomOverride1');
WITH cte AS (
SELECT PK, VALINT, DESCRIPTION1
FROM @TABLE1
UNION
SELECT 0, 1, 'Default1Val'
UNION
SELECT 0, 2, 'Default2Val'
)
SELECT C.VALINT, C.DESCRIPTION1
FROM (
SELECT MAX(PK)AS PK, VALINT
FROM cte A
GROUP BY VALINT
) B
inner join cte C on B.PK = C.PK AND B.VALINT = C.VALINT;
返回:
VALINT DESCRIPTION1
2 Default2Val
1 CustomOverride1
我认为如果你正确使用
ISNULL
和LEFT-OUTER-JOIN
的组合,你应该能够实现你的目标。我认为如果你正确使用ISNULL
和LEFT-OUTER-JOIN
的组合,你应该能够实现你的目标。