क्या कोई मुझे इसका एक अच्छा उदाहरण दे सकता है जब क्रॉस एप्लाई से उन मामलों में फर्क पड़ता है जहां इनर जॉइन भी काम करेगा?
विस्तृत प्रदर्शन तुलना के लिए मेरे ब्लॉग में लेख देखें:
INNER JOIN
बनामCROSS APPLY
CROSS APPLY
उन चीजों पर बेहतर काम करता है जिनका कोई आसान नहीं है JOIN
हालत।
यह एक 3
. का चयन करता है t2
. से अंतिम रिकॉर्ड t1
. से प्रत्येक रिकॉर्ड के लिए :
SELECT t1.*, t2o.*
FROM t1
CROSS APPLY
(
SELECT TOP 3 *
FROM t2
WHERE t2.t1_id = t1.id
ORDER BY
t2.rank DESC
) t2o
इसे INNER JOIN
. के साथ आसानी से तैयार नहीं किया जा सकता है हालत।
आप शायद CTE
. का उपयोग करके ऐसा कुछ कर सकते हैं और विंडो फ़ंक्शन:
WITH t2o AS
(
SELECT t2.*, ROW_NUMBER() OVER (PARTITION BY t1_id ORDER BY rank) AS rn
FROM t2
)
SELECT t1.*, t2o.*
FROM t1
INNER JOIN
t2o
ON t2o.t1_id = t1.id
AND t2o.rn <= 3
, लेकिन यह कम पठनीय और शायद कम कुशल है।
अपडेट करें:
अभी चेक किया गया।
master
लगभग 20,000,000
. की एक तालिका है PRIMARY KEY
के साथ रिकॉर्ड करता है id
. पर ।
यह प्रश्न:
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM master
),
t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
JOIN q
ON q.rn <= t.id
लगभग 30
. के लिए चलता है सेकंड, जबकि यह एक:
WITH t AS
(
SELECT 1 AS id
UNION ALL
SELECT 2
)
SELECT *
FROM t
CROSS APPLY
(
SELECT TOP (t.id) m.*
FROM master m
ORDER BY
id
) q
तत्काल है।