Tablo değerli işlevli bir tabloya nasıl katılınır?


53

Kullanıcı tanımlı bir işleve sahibim:

create function ut_FooFunc(@fooID bigint, @anotherParam tinyint)
returns @tbl Table (Field1 int, Field2 varchar(100))
as
begin
  -- blah blah
end

Şimdi buna benzer bir masada katılmak istiyorum.

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
join ut_FooFunc(f.ID, 1) u -- doesn't work
where f.SomeCriterion = 1

Bir başka deyişle, tüm Fookayıtlar SomeCriterion1, ben görmek istiyorum Foo IDve Descdeğerlerine yanında, Field1ve Field2o döndürülür ut_FooFuncbir giriş için Foo.ID.

Bunu yapmak için sözdizimi nedir?

Yanıtlar:


84

CROSS APPLYKatılmana gerek yok.

Birleştirmelerde yer alan tablo ifadelerinin tanımı kararlı olmalıdır. Başka bir deyişle, tablo ifadesinin başka bir tablodaki satırın değerine bağlı olarak farklı bir şey anlamına gelmesiyle ilişkilendirilemezler.

select f.ID, f.Desc, u.Field1, u.Field2
from Foo f 
Cross apply ut_FooFunc(f.ID, 1) u
where f.SomeCriterion = ...

0

İpliğin eski olduğunu biliyorum, aynı soru soruldu, bir test yaptım, sonuç şöyle ...

FacCurrencyRate kaydında = 14264, TestFunction bağımsız olarak çalıştırıldığında 105 döndürür.

    SELECT F.*, x.CurrencyKey, x.CurrencyName
    FROM ( 
           SELECT CurrencyKey, CurrencyName FROM dbo.TestFunction()
        ) x
    INNER JOIN [dbo].[FactCurrencyRate] F ON x.CurrencyKey = f.CurrencyKey;

İdam süresi ...

    (14264 rows affected)
    Table 'FactCurrencyRate'. Scan count 1, logical reads 75, physical reads 1, read-ahead reads 73, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DimCurrency'. Scan count 1, logical reads 2, physical reads 1, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 31 ms,  elapsed time = 749 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

Önerilen cevabı aşağıdaki gibi kullanırsam ...

select F.*, x.CurrencyKey, x.CurrencyName from [dbo].[FactCurrencyRate] F
cross apply dbo.TestFunction() x

Yürütme süresi ve sonuç sayısı ...

(1497720 rows affected)
Table 'FactCurrencyRate'. Scan count 1, logical reads 75, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 1, logical reads 38110, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'DimCurrency'. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 2106 ms,  elapsed time = 43242 ms.

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

Burada gördüğüm şey, iç sorgulamanın daha doğru sonuç dizisini ortaya çıkarması ve yürütme süresinin çok daha verimli olmasıdır. Aynı şeyi yapmak için daha iyi bir yaklaşımla beni düzeltin!


1
Çapraz uygulama her dış satıra uygulanır (yani satır satır), bu nedenle özellikle daha büyük veri kümelerinde çok daha yavaştır. Bunu tersine çevirerek (yalnızca TVF’de eşleşmesi gereken sonuçları almak istediğiniz için, sonra çıkarma süresini (hiçbir şey yapmayan aramalar yok) ve kaç satır döndürdüğünüz önemli ölçüde azalır. birinciden çok daha fazla satır döndürür, doğruluk devam ettiği sürece iş gereksinimlerinize bağlıdır
Jonathan Fite

Evet katılıyorum. Ancak, ilk soruların ışığında kodu yazdım; burada tablolar arasında bir ya da çok ilişki olduğunu düşünüyorum. Ve ikincisi, bir röportajda bir soru soruldu. Teşekkürler
user3104116
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.