此查询按原样执行。但是,SQL Management Studio不会将其保存为视图,因为我定义了一个变量。
DECLARE @HighestTransaction int SET @HighestTransaction = (SELECT MAX(CardID) FROM dbo.Transactions) SELECT Uploads.*, Transactions.* FROM Uploads LEFT OUTER JOIN dbo.Transactions ON dbo.Uploads.Code = dbo.Transactions.CardID WHERE (Uploads.Code > CASE WHEN @HighestTransaction IS NULL THEN -1 ELSE @HighestTransaction END)
我还没有真正使用存储过程或用户定义的函数,所以我不确定这样做的最佳方法。或者,如果有更好的方式来写这个,我也愿意接受建议。
答案 0 :(得分:5)
像...一样的东西。
WITh cHighestCard AS
(
SELECT ISNULL(MAX(CardID), -1) AS MaxCard FROM dbo.Transactions
)
SELECT STAUpload.*, Transactions.*
FROM dbo.STAUpload LEFT OUTER JOIN
dbo.Transactions ON dbo.STAUpload.Code = dbo.Transactions.CardID
WHERE dbo.STAUpload.Code > MaxCard --edit, error spotted by martin
编辑:不需要CTE:它混合了集合和标量。糟糕。
SELECT STAUpload.*, Transactions.*
FROM dbo.STAUpload LEFT OUTER JOIN
dbo.Transactions ON dbo.STAUpload.Code = dbo.Transactions.CardID
WHERE dbo.STAUpload.Code >
(SELECT ISNULL(MAX(CardID), -1) AS MaxCard
FROM dbo.Transactions)
答案 1 :(得分:2)
由于您提到您尝试将其创建为视图,这意味着您可能希望在另一个查询中使用结果。如果这是真的,我会将其设为table-valued function。
答案 2 :(得分:0)
这是一个存储过程。这很容易使用。只需告诉管理工作室您想要创建一个新程序,它甚至会为您构建所有基本框架语法。
答案 3 :(得分:0)
您可以将其重新编码为带有COALESCE的子查询,以避免双重输入:
SELECT ....
FROM ....
WHERE dbo.STAUpload.code > COALESCE(
(Select max(cardId) from dbo.transactions),-1)
然后它变成了一个观点。
答案 4 :(得分:0)
您可以在存储过程中执行此操作。只需传入您的变量,它就可以正常工作。
快速搜索并查看msdn或在线图书上的存储过程。
答案 5 :(得分:0)
这可能只是一个简单的视图,无需使用CTE即可工作。子查询中针对SELECT MAX的ISNULL可以更容易解释为将ISNULL内插到子查询中。
CREATE VIEW Q_SO
AS
SELECT Uploads.*, Transactions.*
FROM Uploads
LEFT OUTER JOIN dbo.Transactions
ON dbo.Uploads.Code = dbo.Transactions.CardID
WHERE (Uploads.Code > ISNULL((SELECT MAX(CardID) FROM dbo.Transactions),-1))
作为无参数表值函数
CREATE FUNCTION Q_FN() RETURNS TABLE AS RETURN
SELECT Uploads.*, Transactions.*
FROM Uploads
LEFT OUTER JOIN dbo.Transactions
ON dbo.Uploads.Code = dbo.Transactions.CardID
WHERE (Uploads.Code > ISNULL((SELECT MAX(CardID) FROM dbo.Transactions),-1))
答案 6 :(得分:0)
Just CROSS JOIN将@HighestTansaction
初始化为主查询的子查询,如下所示:
SELECT Uploads.*, Transactions.*
FROM Uploads LEFT OUTER JOIN
dbo.Transactions ON dbo.Uploads.Code = dbo.Transactions.CardID CROSS JOIN
(SELECT ISNULL(MAX(CardID),-1) FROM dbo.Transactions) m(HighestTransaction)
WHERE (Uploads.Code > m.HighestTransaction)