在表和函数的值之间寻找

时间:2018-07-17 11:44:05

标签: sql-server sql-server-2008-r2

我有下表:

表格:

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

cola   colb   colc   cold
-------------------------
2      4      x      z
6      8      ab     zub
10     12     jc     me

我有将返回表值的功能。

函数返回:

f_column
----
1
2
5
11

现在,我想显示colc,cold中的t1,其中函数结果f_column在表cola的{​​{1}}和colb之间。

预期结果:

t1

3 个答案:

答案 0 :(得分:2)

考虑到您说该函数返回了数据集,因此假设是一个表值函数。

使用表值功能,您可以在表上使用FROM,就像使用表一样(如果要对表使用“ JOIN”,则必须使用APPLY) 。因此,这是一个非常简单的查询:

SELECT t1.colc, t1.cold
FROM dbo.YourFunction (Parameter1, Parameter2) YF
     JOIN dbo.t1 ON YF.f_column BETWEEN t1.cola AND t1.colb;

以上示例假定您的函数有2个参数。您需要对其进行更改以使其与您的商品相关。

编辑:作为完整的工作示例:

USE Sandbox;
GO

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

INSERT INTO dbo.t1 (cola,
                    colb,
                    colc,
                    cold)
VALUES (2,4,'x','z'),
       (6,8,'ab','zub'),
       (10,12,'jc','me');

GO
CREATE FUNCTION f1() RETURNS table
AS RETURN 
    SELECT *
    FROM (VALUES(1),(2),(5),(11)) V(f_column);
GO

SELECT t1.colc, t1.cold
FROM dbo.f1()
     JOIN dbo.t1 ON f1.f_column BETWEEN t1.cola AND t1.colb;

GO
DROP TABLE t1;
DROP FUNCTION f1;

答案 1 :(得分:2)

这里有许多假设 这是一个表值函数吗? -不知道所需的参数

您可以对函数使用JOIN或交叉应用

CREATE FUNCTION f_column ()
RETURNS TABLE
AS RETURN
(
    SELECT Ret =  1
    UNION SELECT 2
    UNION SELECT 5
    UNION SELECT 11

)
GO

CREATE TABLE t1
(
   cola int,
   colb int,
   colc varchar(10),
   cold varchar(10)
);

INSERT INTO dbo.t1
(cola,colb,colc,cold)
VALUES
(2, 4, 'x', 'y') , (6, 8, 'ab', 'zub') , (10, 12, 'jc', 'me') 

SELECT 
 T.colc
,T.cold 
FROM dbo.t1 T
CROSS APPLY dbo.f_column() F WHERE F.Ret BETWEEN T.cola AND T.colb
--JOIN dbo.f_column() F ON F.Ret BETWEEN T.cola AND T.colb

DROP TABLE dbo.t1
DROP FUNCTION f_column

答案 2 :(得分:-1)

您需要将函数结果与表连接。可能是这样的:

SELECT DISTINCT colc, cold FROM t1 INNER JOIN tf_column WHERE f_column
>= cola AND f_column <= colb

假设tf_column是一个只有一列(f_column)的临时表