代码之家  ›  专栏  ›  技术社区  ›  MAK

在表和函数的值之间查找

  •  0
  • MAK  · 技术社区  · 7 年前

    我有下表:

    表:

    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 Where函数结果 f_column 之间 cola colb 表的 T1 .

    预期结果:

    colc   cold
    ------------
    x      z
    jc     me
    
    3 回复  |  直到 7 年前
        1
  •  2
  •   Larnu    7 年前

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

    使用表值funciton,可以使用 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;
    

    上面的示例假设您的函数有两个参数。你需要改变它,使它与你的相关。

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

    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;
    
        2
  •  2
  •   Mazhar    7 年前

    这里有很多假设 它可能是一个表值函数?-不知道它需要什么参数,如果有的话。

    可以对函数使用联接或交叉应用

    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
    
        3
  •  -1
  •   S. Miranda    7 年前

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

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

    假设tf_列是一个只有一列的临时表(f_列)