使用内联函数时,我得到奇怪的结果.这是代码:
IF EXISTS (
SELECT * FROM sys.objects AS o WHERE name = 'vendor_relation_users'
) DROP FUNCTION dbo.vendor_relation_users;
GO
CREATE FUNCTION [dbo].[vendor_relation_users]
(
@user_name CHAR(12)
)
RETURNS TABLE
AS
RETURN (SELECT @user_name AS user_name WHERE @user_name NOT LIKE '06%');
GO
DECLARE @u CHAR(12) = '066BDLER'
SELECT a.user_name, is_v.user_name
FROM (SELECT @u AS user_name) a
OUTER APPLY [dbo].[vendor_relation_users](@u) AS is_v
SELECT a.user_name, is_v.user_name
FROM (SELECT @u AS user_name) a
OUTER APPLY (SELECT @u AS user_name WHERE @u NOT LIKE '06%') AS …Run Code Online (Sandbox Code Playgroud) 在下面的例子中,我试图根据每个酒吧位置的可用性来计算我可以制作的饮料数量.
进一步澄清,如下例所示:基于下图中突出显示的数字; 我知道我只能在6/30/2018制作1玛格丽塔(如果我将物资运到该地点,则在DC或FL中).
数据表的样本
请使用以下代码输入上面的相关数据:
CREATE TABLE #drinks
(
a_date DATE,
loc NVARCHAR(2),
parent NVARCHAR(20),
line_num INT,
child NVARCHAR(20),
avail_amt INT
);
INSERT INTO #drinks VALUES ('6/26/2018','CA','Long Island','1','Vodka','7');
INSERT INTO #drinks VALUES ('6/27/2018','CA','Long Island','2','Gin','5');
INSERT INTO #drinks VALUES ('6/28/2018','CA','Long Island','3','Rum','26');
INSERT INTO #drinks VALUES ('6/26/2018','DC','Long Island','1','Vodka','15');
INSERT INTO #drinks VALUES ('6/27/2018','DC','Long Island','2','Gin','18');
INSERT INTO #drinks VALUES ('6/28/2018','DC','Long Island','3','Rum','5');
INSERT INTO #drinks VALUES ('6/26/2018','FL','Long Island','1','Vodka','34');
INSERT INTO #drinks VALUES ('6/27/2018','FL','Long Island','2','Gin','14');
INSERT INTO #drinks VALUES ('6/28/2018','FL','Long Island','3','Rum','4');
INSERT INTO #drinks VALUES …Run Code Online (Sandbox Code Playgroud) 我想为Entity Framework查询创建一些测试用例,这些测试确实生成包含CROSS APPLY或OUTER APPLY运算符的SQL命令.
有人可以显示出现这些SQL查询的典型场景吗?
主表
x------x--------------------x
| Id | Name |
x------x--------------------x
| 1 | A |
| 2 | B |
| 3 | C |
x------x--------------------x
Run Code Online (Sandbox Code Playgroud)
详情表
x------x--------------------x-------x
| Id | PERIOD | QTY |
x------x--------------------x-------x
| 1 | 2014-01-13 | 10 |
| 1 | 2014-01-11 | 15 |
| 1 | 2014-01-12 | 20 |
| 2 | 2014-01-06 | 30 |
| 2 | 2014-01-08 | 40 |
x------x--------------------x-------x
Run Code Online (Sandbox Code Playgroud)
我LEFT JOIN和OUTER APPLY使用时得到相同的结果.
LEFT JOIN
SELECT …Run Code Online (Sandbox Code Playgroud) 当两个表之间创建一个笛卡尔积,有什么区别CROSS APPLY和OUTER APPLY?
这似乎是一个愚蠢的问题,因为没有表之间表达的关系,右手表不能不满足关系,但我尊重我不知道的.
当我通过简单的测试设置查看执行计划时,它们是相同的[两个索引寻求进入嵌套循环(内部联接)],但简单的测试设置可能具有欺骗性.
这是我的意思的一个例子(SQL Fiddle).设置:
CREATE TABLE dbo.First (
Id INT IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(100)
);
GO
DECLARE @n INT = 1;
WHILE @n < 10000
BEGIN
INSERT INTO dbo.First (Name) VALUES ('First' + CONVERT(NVARCHAR(100), @n));
SET @n = @n + 1;
END
GO
CREATE INDEX IX__First__Name ON dbo.First(Name);
GO
CREATE TABLE dbo.Second (
Id INT IDENTITY(1, 1) PRIMARY KEY,
Name NVARCHAR(100)
);
GO
DECLARE @n INT = 1;
WHILE …Run Code Online (Sandbox Code Playgroud) 在以下示例中,我将tbA.ID传递给tbC查询。在这种情况下,我使用了 SqlServer 的 OUTER APPLY 运算符。
SELECT
...
FROM (SELECT ID FROM TableA ...) tbA
OUTER APPLY (SELECT ... FROM TableB tbB WHERE tbA.ID = tbB.ID) tbC
...
Run Code Online (Sandbox Code Playgroud)
在 Oracle 中,我们没有 OUTER APPLY 运算符。那么,如何在不修改查询结构的情况下将值 (tbA.ID) 从左侧查询传递到连接的右侧查询 (tbC)?
Oracle 中的 OUTER APPLY 是否有其他选择?
我通过文章去约CROSS APPLY,并OUTER APPLY在SQL Server中.以下表格用于说明两者.
员工表:
EmployeeID FirstName LastName DepartmentID
1 Orlando Gee 1
2 Keith Harris 2
3 Donna Carreras 3
4 Janet Gates 3
Run Code Online (Sandbox Code Playgroud)
部门表:
DepartmentID Name
1 Engineering
2 Administration
3 Sales
4 Marketing
5 Finance
Run Code Online (Sandbox Code Playgroud)
我明白这OUTER APPLY是类似于LEFT OUTER JOIN.但当我OUTER APPLY在表之间应用如下,
select * from Department e
outer apply
Employee d
where d.DepartmentID = e.DepartmentID
Run Code Online (Sandbox Code Playgroud)
我得到了以下结果(与INNER JOIN结果相同)
DepartmentID Name EmployeeID FirstName LastName DepartmentID
1 Engineering 1 Orlando …Run Code Online (Sandbox Code Playgroud) outer-apply ×7
sql-server ×7
cross-apply ×3
t-sql ×3
sql ×2
apply ×1
join ×1
left-join ×1
oracle ×1
parent-child ×1