আমি কখন অভ্যন্তরীণ যোগদানের উপরে ক্রস প্রয়োগ করব?


925

ক্রস অ্যাপ্লিকেশন ব্যবহারের মূল উদ্দেশ্য কী ?

আমি পড়েছি (অস্পষ্টভাবে, ইন্টারনেটে পোস্টের মাধ্যমে) যা cross applyআপনি বিভাজনে নিচ্ছেন যদি বড় ডেটা সেটগুলি নির্বাচন করার সময় আরও কার্যকর হতে পারে। (পেজিং মনে আসে)

আমি এও জানি যে CROSS APPLYডান-টেবিল হিসাবে কোনও ইউডিএফের প্রয়োজন নেই।

বেশিরভাগ INNER JOINপ্রশ্নের মধ্যে (একের সাথে একাধিক সম্পর্ক), আমি তাদের ব্যবহারের জন্য পুনরায় লিখতে পারি CROSS APPLY, তবে তারা সর্বদা আমাকে সমপরিমাণ বাস্তবায়ন পরিকল্পনা দেয়।

যে কেউ কাজ করতে পারে CROSS APPLYসেই ক্ষেত্রে যখন কোন পার্থক্য তৈরি করে তখন কেউ আমাকে একটি ভাল উদাহরণ দিতে পারেন INNER JOIN?


সম্পাদনা:

এখানে একটি তুচ্ছ উদাহরণ, যেখানে মৃত্যুদন্ড কার্যকর করার পরিকল্পনাগুলি একই রকম। (যেখানে তারা পৃথক এবং কোথায় cross applyদ্রুত / আরও দক্ষ) আমাকে সেগুলি দেখান )

create table Company (
    companyId int identity(1,1)
,   companyName varchar(100)
,   zipcode varchar(10) 
,   constraint PK_Company primary key (companyId)
)
GO

create table Person (
    personId int identity(1,1)
,   personName varchar(100)
,   companyId int
,   constraint FK_Person_CompanyId foreign key (companyId) references dbo.Company(companyId)
,   constraint PK_Person primary key (personId)
)
GO

insert Company
select 'ABC Company', '19808' union
select 'XYZ Company', '08534' union
select '123 Company', '10016'


insert Person
select 'Alan', 1 union
select 'Bobby', 1 union
select 'Chris', 1 union
select 'Xavier', 2 union
select 'Yoshi', 2 union
select 'Zambrano', 2 union
select 'Player 1', 3 union
select 'Player 2', 3 union
select 'Player 3', 3 


/* using CROSS APPLY */
select *
from Person p
cross apply (
    select *
    from Company c
    where p.companyid = c.companyId
) Czip

/* the equivalent query using INNER JOIN */
select *
from Person p
inner join Company c on p.companyid = c.companyId

50
আমি জানি এটি আমার প্রথম পিকির কিন্তু 'পারফরম্যান্ট' অবশ্যই একটি শব্দ। এটি কেবল দক্ষতার সাথে সম্পর্কিত নয়।
Rire1979

2
এটি স্কয়ার xquery জন্য খুব দরকারী। এটি পরীক্ষা করুন
এআরজেড

3
"অভ্যন্তরীণ লুপ যোগদান" ব্যবহারের মত মনে হচ্ছে ক্রস প্রয়োগের খুব কাছাকাছি হবে। আমি আশা করি যে আপনার উদাহরণটি বিশদে যেটি ইঙ্গিতটি সমতুল্য হবে। শুধু যোগদানের কথা বলার ফলে অভ্যন্তরীণ / লুপ / ​​মার্জ বা এমনকি "অন্যান্য" হতে পারে কারণ এটি অন্যান্য যোগদানের সাথে পুনরায় ব্যবস্থা করতে পারে।
ক্রোকুসেক

3
যোগদানের ফলে প্রচুর সারি তৈরি হবে তবে আপনাকে একবারে কেবল একটি সারি যোগ করার মূল্যায়ন করতে হবে। আমার একটি কেস ছিল আমার 100 মিলিয়নেরও বেশি সারি সহ একটি টেবিলে একটি স্ব-যোগদানের প্রয়োজন ছিল এবং যথেষ্ট স্মৃতি ছিল না। সুতরাং আমি মেমরির পদচিহ্নগুলি নামিয়ে আনতে কার্সারে গিয়েছিলাম। কার্সার থেকে আমি ম্যানেজ করা মেমরির পদচিহ্ন হিসাবে ক্রস প্রয়োগ করতে গিয়েছিলাম এবং কার্সারের চেয়ে 1/3 দ্রুত ছিল।
পাপারাজ্জো

10
CROSS APPLYসেটটির অপরটির উপর নির্ভর করে ( JOINঅপারেটরের বিপরীতে ) নির্ভর করার ক্ষেত্রে এর স্পষ্ট ব্যবহার রয়েছে , তবে এটি কোনও ব্যয় ছাড়াই আসে না: এটি এমন ফাংশনের মতো আচরণ করে যা বাম সেটটির প্রতিটি সদস্যের উপর পরিচালিত হয় , সুতরাং, এসকিউএল সার্ভারের শর্তে এটি সর্বদা একটি সঞ্চালন করুন Loop Join, যা সেটগুলিতে যোগদানের সবচেয়ে ভাল উপায় নয়। সুতরাং, APPLYআপনার যখন প্রয়োজন হবে তখন ব্যবহার করুন , তবে এর বিরুদ্ধে অতিরিক্ত ব্যবহার করবেন না JOIN
জেরার্ডো লিমা

উত্তর:


667

ক্রস অ্যাপ্লায়ারী যখন সেই ক্ষেত্রে অনার যোগ দিয়ে কাজ করবে তখন তার ক্ষেত্রে কোনও পার্থক্য আনার জন্য কেউ কি আমাকে একটি ভাল উদাহরণ দিতে পারেন?

বিস্তারিত পারফরম্যান্স তুলনার জন্য আমার ব্লগে নিবন্ধটি দেখুন:

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

, তবে এটি কম পাঠযোগ্য এবং সম্ভবত কম দক্ষ।

হালনাগাদ:

সবেমাত্র চেক করা হয়েছে।

master20,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

তাত্ক্ষণিক।


2
আরিয়েলের লিঙ্কটির শেষ দেখুন। একটি সারিবদ্ধ সংখ্যা () ক্যোয়ারী ঠিক ততই দুর্দান্ত এবং এমনকি যোগদানেরও প্রয়োজন নেই। সুতরাং আমি মনে করি না যে এই অবস্থার জন্য আমার ক্রস অ্যাপ্লিকেশন ব্যবহার করা উচিত (শীর্ষ 3 নির্বাচন করুন, টি 1.id দ্বারা বিভাজন)।
জেফ মিটবল ইয়াং

375
যদিও এটি সর্বাধিক জনপ্রিয় উত্তর আমি মনে করি না এটি আসল প্রশ্নের উত্তর দেয় "" ক্রস প্রয়োগের মূল উদ্দেশ্য কী? "। মূল উদ্দেশ্য হ'ল প্যারামিটারগুলির সাথে সারণী ফাংশনগুলি প্রতি সারিতে একবার সম্পাদন করা এবং তারপরে ফলাফলগুলিতে যোগ দেওয়া enable
মাইককুলস

5
@ মাইক: আপনি কিভাবে এর TVFসাথে কল করবেন INNER JOIN?
কাসনসুই

15
@ মাইককুলস হ্যাঁ, তবে ওপি ব্যবহারের মূল উদ্দেশ্য জিজ্ঞাসা করেনি , কখন CROSS APPLYএটি বেছে নিতে হবে INNER JOIN, কখন এটি কার্যকর হবে তা জানতে চেয়েছিলেন ।
এরিক

8
এটি উল্লেখযোগ্য হতে পারে যে এটিকে lateral joinস্ট্যান্ডার্ড (এএনএসআই) এসকিউএল বলা হয়
a_horse_with_no_name

198

cross applyকখনও কখনও আপনাকে এমন কাজ করতে সক্ষম করে যা আপনি করতে পারবেন না inner join

উদাহরণ (একটি সিনট্যাক্স ত্রুটি):

select F.* from sys.objects O  
inner join dbo.myTableFun(O.name) F   
on F.schema_id= O.schema_id

এটি একটি বাক্য গঠন ত্রুটি , কারণ যখন এটি ব্যবহার করা হয় inner join, সারণী ফাংশনগুলি কেবল প্যারামিটার হিসাবে পরিবর্তনশীল বা ধ্রুবক নিতে পারে । (অর্থাৎ, টেবিল ফাংশন পরামিতি অন্য সারণীর কলামের উপর নির্ভর করতে পারে না))

যাহোক:

select F.* from sys.objects O  
cross apply ( select * from dbo.myTableFun(O.name) ) F  
where F.schema_id= O.schema_id

এটি আইনী।

সম্পাদনা করুন: অথবা বিকল্পভাবে, সংক্ষিপ্ত বাক্য গঠন: (এরিক দ্বারা)

select F.* from sys.objects O  
cross apply dbo.myTableFun(O.name) F
where F.schema_id= O.schema_id

সম্পাদনা:

দ্রষ্টব্য: ইনফর্মিক্স 12.10 এক্সসি 2 + তে ল্যাটারাল ডেরিভড টেবিল রয়েছে এবং পোস্টগ্র্যাস্কেল (9.3+) এর লেটারাল সাবকিউরিস রয়েছে যা একই প্রভাবের জন্য ব্যবহার করা যেতে পারে।


11
আমি মনে করি কেন আমাদের ক্রস প্রয়োগ হয়েছে এর পিছনে এই যুক্তি। আপনি নীচের লিঙ্কটি পরীক্ষা করে দেখলে ক্রস প্রয়োগের বিষয়ে এমএস প্রথম কথা বলে। এটির অন্যান্য ব্যবহার থাকতে পারে তবে আমি মনে করি এটিই কারণ এটি চালু হয়েছিল। এটি ছাড়া টেবিলের ফাংশনগুলি অনেক পরিস্থিতিতে ব্যবহারযোগ্য হবে না। টেকনেট.মাইক্রোসফট.ইন- ইউএস
লিবারিয়ান/

অনেক প্রয়োজনীয় পরিমিতি বজায় রাখার সাথে সাথে ইনলাইন টেবিল ফাংশনগুলির সাথে মিলিত হলে ক্রস অ্যাপ্লিকেশন একটি দুর্দান্ত সম্পাদন পরিকল্পনাও তৈরি করে।
নুরেটিন

14
SELECTভিতরে প্রয়োজন নেই CROSS APPLY। চেষ্টা করুন CROSS APPLY dbo.myTableFun(O.name) F
এরিক

1
@ এরিক নিশ্চিত, আপনি ক্রস প্রয়োগের জন্য সর্বদা কম নমনীয় বাক্য গঠন ব্যবহার করতে পারেন। আমি আরও সাধারণীকৃত সংস্করণটি দেখছিলাম যা আপনি কখনও কখনও কোয়েরিতে কলামগুলি গণনা করা শক্ত এড়াতে যাতে ব্যবহার করতে পারেন তা ব্যবহার করতে পারেন।
নুরেটিন

2
টেল ফাংশন প্যারামিটার বাহ্যিক নির্বাচনের ক্ষেত্রে অন্য টেবিলের কলাম (ওরফে বাহ্যিক রেফারেন্স) এর উপর নির্ভর করে যদি @ বলু অভ্যন্তরীণ যোগদান কাজ করবে না। টেবিল ফাংশন প্যারামিটারটি আক্ষরিক বা পরিবর্তনশীল হলে এটি কাজ করবে। ক্রস অ্যাপ্লিকেশন উভয় ক্ষেত্রেই কাজ করবে।
নুরেটিন

175

আপনার দুটি টেবিল রয়েছে তা বিবেচনা করুন।

মাস্টার সারণী

x------x--------------------x
| Id   |        Name        |
x------x--------------------x
|  1   |          A         |
|  2   |          B         |
|  3   |          C         |
x------x--------------------x

বিশদ টেবিল

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

অনেক পরিস্থিতিতে যেখানে আমরা প্রতিস্থাপন করা প্রয়োজন আছে INNER JOINসঙ্গে CROSS APPLY

1. TOP nফলাফলের উপর ভিত্তি করে দুটি টেবিল যোগ দিন

যদি আমরা নির্বাচন করতে হবে বিবেচনা করুন Idএবং Nameথেকে Masterপ্রত্যেকের জন্য এবং শেষ দুটি তারিখের Idথেকে Details table

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
INNER JOIN
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D      
    ORDER BY CAST(PERIOD AS DATE)DESC
)D
ON M.ID=D.ID

উপরের প্রশ্নটি নিম্নলিখিত ফলাফল উত্পন্ন করে।

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
x------x---------x--------------x-------x

দেখুন, এটি শেষ দুটি তারিখের সাথে শেষ দুটি তারিখের ফলাফল তৈরি করেছে Idএবং তারপরে কেবলমাত্র বাইরের ক্যোয়ারিতে এই রেকর্ডগুলিতে যোগদান করেছে Id, যা ভুল। এটি Ids1 এবং 2 উভয়ই ফিরতে হবে তবে এটি কেবল 1 টি ফিরে এসেছে কারণ 1 এর শেষ দুটি তারিখ রয়েছে। এটি সম্পাদন করার জন্য, আমাদের ব্যবহার করা দরকার CROSS APPLY

SELECT M.ID,M.NAME,D.PERIOD,D.QTY
FROM MASTER M
CROSS APPLY
(
    SELECT TOP 2 ID, PERIOD,QTY 
    FROM DETAILS D  
    WHERE M.ID=D.ID
    ORDER BY CAST(PERIOD AS DATE)DESC
)D

এবং নিম্নলিখিত ফলাফল গঠন।

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-08   |  40   |
|   2  |   B     | 2014-01-06   |  30   |
x------x---------x--------------x-------x

এখানে কিভাবে এটা কাজ করে. এর ভিতরে থাকা ক্যোয়ারীটি CROSS APPLYবাইরের সারণিকে উল্লেখ করতে পারে, যেখানে এটি INNER JOINকরতে পারে না (এটি সংকলনের ত্রুটি ছুঁড়ে ফেলে)। শেষ দুটি তারিখ সন্ধান করার সময়, যোগদান করা ভিতরে করা হয়, CROSS APPLYঅর্থাৎ WHERE M.ID=D.ID

2. যখন আমাদের INNER JOINফাংশনগুলি ব্যবহার করে কার্যকারিতা প্রয়োজন ।

CROSS APPLYINNER JOINযখন আমাদের Masterটেবিল থেকে ফলাফল পেতে হবে এবং ক এর সাথে প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে function

SELECT M.ID,M.NAME,C.PERIOD,C.QTY
FROM MASTER M
CROSS APPLY dbo.FnGetQty(M.ID) C

এবং এখানে ফাংশন

CREATE FUNCTION FnGetQty 
(   
    @Id INT 
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT ID,PERIOD,QTY 
    FROM DETAILS
    WHERE ID=@Id
)

যা নিম্নলিখিত ফলাফল উত্পন্ন

x------x---------x--------------x-------x
|  Id  |   Name  |   PERIOD     |  QTY  |
x------x---------x--------------x-------x
|   1  |   A     | 2014-01-13   |  10   |
|   1  |   A     | 2014-01-11   |  15   |
|   1  |   A     | 2014-01-12   |  20   |
|   2  |   B     | 2014-01-06   |  30   |
|   2  |   B     | 2014-01-08   |  40   |
x------x---------x--------------x-------x

ক্রস প্রয়োগের অতিরিক্ত অ্যাডভান্সটি

APPLYজন্য একটি প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে UNPIVOT। হয় CROSS APPLYবা OUTER APPLYএখানে ব্যবহার করা যেতে পারে, যা বিনিময়যোগ্য।

নীচের টেবিলটি (নামযুক্ত MYTABLE) আছে তা বিবেচনা করুন ।

x------x-------------x--------------x
|  Id  |   FROMDATE  |   TODATE     |
x------x-------------x--------------x
|   1  |  2014-01-11 | 2014-01-13   | 
|   1  |  2014-02-23 | 2014-02-27   | 
|   2  |  2014-05-06 | 2014-05-30   | 
|   3  |     NULL    |    NULL      |
x------x-------------x--------------x

কোয়েরিটি নীচে রয়েছে।

SELECT DISTINCT ID,DATES
FROM MYTABLE 
CROSS APPLY(VALUES (FROMDATE),(TODATE))
COLUMNNAMES(DATES)

যা আপনার জন্য ফলাফল এনেছে

  x------x-------------x
  | Id   |    DATES    |
  x------x-------------x
  |  1   |  2014-01-11 |
  |  1   |  2014-01-13 |
  |  1   |  2014-02-23 |
  |  1   |  2014-02-27 |
  |  2   |  2014-05-06 |
  |  2   |  2014-05-30 | 
  |  3   |    NULL     | 
  x------x-------------x

4
2 বনাম 4 রেকর্ডের সাথে দুর্দান্ত উদাহরণ এবং আমাকে কী প্রসঙ্গে এটির প্রয়োজন হবে তা বুঝতে সহায়তা করেছে।
ট্রেনসন

13
এই উত্তরটি প্রমাণ করে যে কেবল গৃহীত কোনওটিকে বাছাই না করে পৃষ্ঠায় স্ক্রোল করা সত্যিই মূল্যবান।
মোস্তফা আরমান্দি

2
প্রয়োগের ব্যাখ্যার জন্য এখন পর্যন্ত সর্বোত্তম উদাহরণ ... আমি অনেকগুলি পোস্ট পড়েছি এবং বুঝতে পেরেছি যে এই ব্যাখ্যাটি ছবিটিকে জল হিসাবে পরিষ্কার করে। অনেক ধন্যবাদ ভাই।
এজি 7

1
পয়েন্ট 1 এর জন্য যেখানে আমাদের আইডি 1, 2 আইডি 1 এর জন্য 4 টি সারি পরিবর্তে আইডি 1 এর জন্য 2 সারি রয়েছে we
জোসেফ চো

43

আমার কাছে মনে হয় জটিল / নেস্টেড কোয়েরিতে গণনা করা ক্ষেত্রগুলির সাথে কাজ করার সময় ক্রস প্রয়োগ করে একটি নির্দিষ্ট শূন্যস্থান পূরণ করতে পারে এবং সেগুলি সহজ এবং আরও পাঠযোগ্য।

সাধারণ উদাহরণ: আপনার একটি ডওবি রয়েছে এবং আপনি একাধিক বয়স-সম্পর্কিত ক্ষেত্র উপস্থাপন করতে চান যা আপনার অন্যান্য ব্যবহারকারী উত্সে (যেমন কর্মসংস্থান হিসাবে) অন্যান্য ডেটা উত্সগুলিতে নির্ভর করবে, যেমন বয়স, এজগ্রুপ, এজআরহায়িং, ন্যূনতম পুনরায় নিয়োগের তারিখ ইত্যাদি your (উদাহরণস্বরূপ এক্সেল পিভট টেবিল)।

বিকল্পগুলি সীমাবদ্ধ এবং খুব কমই মার্জিত:

  • জোইন সাবকিউরিয়ান্স প্যারেন্ট ক্যোয়ারিতে ডেটার ভিত্তিতে ডেটাসেটে নতুন মানগুলি প্রবর্তন করতে পারে না (এটি নিজের নিজের উপর দাঁড়াতে হবে)।

  • ইউডিএফগুলি পরিষ্কার, তবে ধীরে ধীরে ধীরে ধীরে তারা সমান্তরাল অপারেশনগুলি রোধ করে prevent এবং পৃথক সত্তা হওয়া ভাল (কম কোড) বা খারাপ (কোডটি কোথায়) জিনিস হতে পারে।

  • জংশন টেবিল। কখনও কখনও তারা কাজ করতে পারে তবে খুব শীঘ্রই আপনি সংখ্যক ইউনিয়ন সহ সাবকুইরিতে যোগ দিচ্ছেন। সপ্তাহের দিন.

  • আপনার গণনাগুলিকে আপনার মূল ক্যোয়ারির মধ্যবর্তী উপায়ে প্রাপ্ত ডেটার প্রয়োজন হবে না বলে ধরে নিয়ে আরও একটি একক-উদ্দেশ্য দেখুন তৈরি করুন।

  • মধ্যবর্তী টেবিল হ্যাঁ ... এটি সাধারণত কাজ করে এবং প্রায়শই একটি ভাল বিকল্প হিসাবে এগুলি সূচকযুক্ত এবং দ্রুত করা যেতে পারে তবে আপডেটের বিবৃতিগুলি সমান্তরাল না হওয়ার কারণে এবং ক্যাসকেড সূত্রগুলি (পুনরায় ব্যবহারের ফলাফলগুলি) এর মধ্যে বেশ কয়েকটি ক্ষেত্র আপডেট করার অনুমতি না দেওয়ার কারণে কার্য সম্পাদনও হ্রাস পেতে পারে the একই বিবৃতি। এবং কখনও কখনও আপনি কেবল একটি পাসে জিনিসগুলি করতে পছন্দ করেন।

  • নেস্টিংয়ের প্রশ্নগুলি। হ্যাঁ যে কোনও মুহুর্তে আপনি আপনার পুরো ক্যোয়ারীতে প্রথম বন্ধনী স্থাপন করতে পারেন এবং এটিকে একটি সাবকিউরি হিসাবে ব্যবহার করতে পারেন যার উপর ভিত্তি করে আপনি উত্স ডেটা এবং গণনা করা ক্ষেত্রগুলি একইভাবে পরিচালনা করতে পারেন। এটি কুশ্রী হওয়ার আগে আপনি কেবল এটি এত কিছু করতে পারেন। খুব কুৎসিত.

  • কোড পুনরাবৃত্তি হচ্ছে। 3 টি দীর্ঘ (CASE ... ELSE ... END) স্টেটমেন্টের সর্বাধিক মান কী? এটা পাঠযোগ্য হবে!

    • আপনার ক্লায়েন্টদের জঘন্য জিনিসগুলি নিজেরাই গণনা করতে বলুন।

আমি কি কিছু রেখে গেলাম? সম্ভবত, তাই বিনা দ্বিধায় মন্তব্য করুন। তবে ওহে, ক্রস প্রয়োগ এমন পরিস্থিতিতে গডসেন্ডের মতো: আপনি কেবল একটি সহজ CROSS APPLY (select tbl.value + 1 as someFormula) as crossTblএবং ভয়েলি যুক্ত করুন! আপনার নতুন ক্ষেত্রটি এখন ব্যবহারিকভাবে ব্যবহারের জন্য প্রস্তুত যেমন এটি সর্বদা আপনার উত্স ডেটাতে ছিল।

ক্রস প্রয়োগের মাধ্যমে প্রবর্তিত মানগুলি ...

  • মিশ্রণে পারফরম্যান্স, জটিলতা বা পঠনযোগ্যতার সমস্যাগুলি যুক্ত না করে এক বা একাধিক গণনা করা ক্ষেত্র তৈরি করতে ব্যবহার করুন
  • যোগদানকারীদের মতো, পরবর্তী সময়ে ক্রস-এর বেশ কয়েকটি বিবৃতি নিজেরাই উল্লেখ করতে পারে: CROSS APPLY (select crossTbl.someFormula + 1 as someMoreFormula) as crossTbl2
  • আপনি পরবর্তী JOIN অবস্থায় ক্রস প্রয়োগের মাধ্যমে প্রবর্তিত মানগুলি ব্যবহার করতে পারেন
  • বোনাস হিসাবে, সারণী-মূল্যবান ফাংশন দিক রয়েছে

ডাং, কিছুই তারা করতে পারে না!


1
এটি আমার কাছ থেকে একটি বড় +1, কারণ আমি অবাক হয়েছি যে এটি প্রায়শই উল্লেখ করা হয় না। আপনি উত্পন্ন মানগুলির শৃঙ্খলে কীভাবে "পদ্ধতিগত" গণনা সম্পাদন করতে পারেন তা দেখানোর জন্য আপনি এই উদাহরণটি প্রসারিত করতে পারেন? যেমন: ক্রস আবেদন (crossTbl.value নির্বাচন * দ্বিগুন যেমন tbl.multiplier) multiTbl - Cross (multiTbl.Multiplied / tbl.DerivativeRatio নির্বাচন উদ্ভূত হিসাবে) আবেদন derivedTbl - ইত্যাদি ...
mrmillsy

1
CASE..ELSE..END এর প্রতিস্থাপন হিসাবে ক্রস প্রয়োগ কীভাবে ব্যবহার করতে হবে তার আরও কোনও তথ্য / উদাহরণ?
przemo_li

3
@przemo_li অ্যাপ্লিকেশন কেস স্টেটমেন্টের ফলাফল (অন্যান্য জিনিসগুলির মধ্যে) এটি উল্লেখ করার জন্য সংরক্ষণ করতে ব্যবহার করা যেতে পারে। কাঠামোর মতো কিছু হতে পারে: subquery.interediaResult> সিলেক্ট করুন নির্বাচন করুন 0 তারপর "হ্যাঁ" ELSE "না" কিছুটা টেস্টাল আউটর অ্যাপ্লিকেশন থেকে শেষ করুন (নির্বাচন করুন CASE ... সমাপ্তি ... ELSE ইন্টারমিডিয়েট রেজাল্ট হিসাবে) subquery হিসাবে।
এমটোন

14

ক্রস প্রয়োগ একটি এক্সএমএল ক্ষেত্রের সাথেও ভাল কাজ করে। আপনি যদি অন্যান্য ক্ষেত্রের সাথে মিল রেখে নোড মানগুলি নির্বাচন করতে চান।

উদাহরণস্বরূপ, যদি আপনার কোনও টেবিল থাকে তবে কিছু এক্সএমএল থাকে

<root>
    <subnode1>
       <some_node value="1" />
       <some_node value="2" />
       <some_node value="3" />
       <some_node value="4" />
    </subnode1>
</root>

কোয়েরি ব্যবহার করে

SELECT
       id as [xt_id]
      ,xmlfield.value('(/root/@attribute)[1]', 'varchar(50)') root_attribute_value
  ,node_attribute_value = [some_node].value('@value', 'int')
  ,lt.lt_name   
FROM dbo.table_with_xml xt
CROSS APPLY xmlfield.nodes('/root/subnode1/some_node') as g ([some_node])
LEFT OUTER JOIN dbo.lookup_table lt
ON [some_node].value('@value', 'int') = lt.lt_id

একটি ফলাফল ফিরে আসবে

xt_id root_attribute_value node_attribute_value lt_name
----------------------------------------------------------------------
1     test1            1                    Benefits
1     test1            4                    FINRPTCOMPANY

13

এটি ইতিমধ্যে প্রযুক্তিগতভাবে খুব ভাল উত্তর দেওয়া হয়েছে, তবে এটি কীভাবে চূড়ান্তভাবে কার্যকর তা সম্পর্কে একটি দৃ concrete় উদাহরণ দেই:

বলুন আপনার কাছে দুটি টেবিল রয়েছে, গ্রাহক এবং অর্ডার। গ্রাহকদের অনেক অর্ডার রয়েছে।

আমি এমন একটি দৃষ্টিভঙ্গি তৈরি করতে চাই যা গ্রাহকদের সম্পর্কে আমার বিবরণ দেয় এবং তারা যে সাম্প্রতিকতম আদেশ তৈরি করেছে order শুধু যোগদানের সাথে, এর জন্য কিছু স্ব-যোগদান এবং সমষ্টি প্রয়োজন যা সুন্দর নয়। তবে ক্রস অ্যাপ্লিকেশন সহ, এটি অত্যন্ত সহজ:

SELECT *
FROM Customer
CROSS APPLY (
  SELECT TOP 1 *
  FROM Order
  WHERE Order.CustomerId = Customer.CustomerId
  ORDER BY OrderDate DESC
) T

7

ক্রোস অ্যাপ্লিকেশনটি সাবকোয়ারির প্রতিস্থাপন করতে ব্যবহার করা যেতে পারে যেখানে আপনার সাবকোয়ারির একটি কলাম দরকার

subquery

select * from person p where
p.companyId in(select c.companyId from company c where c.companyname like '%yyy%')

এখানে আমি ক্রস প্রয়োগ ব্যবহার করে কোম্পানির টেবিলের কলামগুলি নির্বাচন করতে সক্ষম হব না

select P.*,T.CompanyName
from Person p
cross apply (
    select *
    from Company C
    where p.companyid = c.companyId and c.CompanyName like '%yyy%'
) T

5

আমার ধারণা এটি পাঠযোগ্যতা হওয়া উচিত;)

ক্রস অ্যাপ্লিকেশনটি এমন কিছু পড়ার লোকদের জন্য কিছুটা স্বতন্ত্র হবে যে কোনও ইউডিএফ ব্যবহার করা হচ্ছে যা বামের টেবিল থেকে প্রতিটি সারিতে প্রয়োগ করা হবে।

অবশ্যই, অন্যান্য সীমাবদ্ধতাগুলি রয়েছে যেখানে অন্য বন্ধুরা উপরে পোস্ট করেছেন এমন জোনের চেয়ে ক্রস অ্যাপ্লিকেশন আরও ভাল ব্যবহার করা হয়।


4

এখানে একটি নিবন্ধ যা জিনগুলিতে তাদের পারফরম্যান্স পার্থক্য এবং ব্যবহারের সাথে এটি সমস্ত ব্যাখ্যা করে।

এসকিউএল সার্ভার যোগ প্রয়োগ করে এবং আউটার প্রয়োগ করুন

এই নিবন্ধে প্রস্তাবিত হিসাবে, স্বাভাবিক যোগদানের ক্রিয়াকলাপগুলির জন্য তাদের মধ্যে পারফরম্যান্সের কোনও পার্থক্য নেই (অভ্যন্তরীণ এবং ক্রস)।

এখানে চিত্র বর্ণনা লিখুন

ব্যবহারের পার্থক্যটি উপস্থিত হয় যখন আপনাকে এই জাতীয় একটি কোয়েরি করতে হবে:

CREATE FUNCTION dbo.fn_GetAllEmployeeOfADepartment(@DeptID AS INT)  
RETURNS TABLE 
AS 
RETURN 
   ( 
   SELECT * FROM Employee E 
   WHERE E.DepartmentID = @DeptID 
   ) 
GO 
SELECT * FROM Department D 
CROSS APPLY dbo.fn_GetAllEmployeeOfADepartment(D.DepartmentID)

এটি হ'ল, যখন আপনাকে ফাংশনের সাথে সম্পর্কিত করতে হবে। এটি INNER JOIN ব্যবহার করে করা যাবে না, যা আপনাকে "মাল্টি পার্ট আইডেন্টিফায়ার" D.DepartmentID "আবদ্ধ হতে পারে না the" প্রতিটি সারিটি পড়ার সাথে সাথে এখানে মানটি ফাংশনে পাঠানো হয়। আমার কাছে দুর্দান্ত লাগছে। :)


3

আচ্ছা আমি নিশ্চিত নই যে এটি ক্রস অ্যাপ্লিকেশন বনাম ইনার জয়েন ব্যবহারের কারণ হিসাবে যোগ্য কিনা, তবে ক্রোস অ্যাপ্লিকেশন ব্যবহার করে একটি ফোরাম পোস্টে এই প্রশ্নের উত্তর আমার কাছে দেওয়া হয়েছিল, সুতরাং ইনার জয়েন ব্যবহার করে কোনও সমতুল্য পদ্ধতি আছে কিনা তা আমি নিশ্চিত নই:

Create PROCEDURE [dbo].[Message_FindHighestMatches]

-- Declare the Topical Neighborhood
@TopicalNeighborhood nchar(255)

হিসাবে শুরু

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON

Create table  #temp
(
    MessageID         int,
    Subjects          nchar(255),
    SubjectsCount    int
)

Insert into #temp Select MessageID, Subjects, SubjectsCount From Message

Select Top 20 MessageID, Subjects, SubjectsCount,
    (t.cnt * 100)/t3.inputvalues as MatchPercentage

From #temp 

cross apply (select count(*) as cnt from dbo.Split(Subjects,',') as t1
             join dbo.Split(@TopicalNeighborhood,',') as t2
             on t1.value = t2.value) as t
cross apply (select count(*) as inputValues from dbo.Split(@TopicalNeighborhood,',')) as t3

Order By MatchPercentage desc

drop table #temp

শেষ


3

অ্যাপলাই অপারেটরের সারমর্মটি হ'ল এফআরওএম ক্লজে অপারেটরের বাম এবং ডানদিকে পারস্পরিক সম্পর্ক স্থাপন করা allow

JOIN এর বিপরীতে, ইনপুটগুলির মধ্যে পারস্পরিক সম্পর্কের অনুমতি নেই।

অ্যাপ্লিকেশন অপারেটরের সাথে সম্পর্ক সম্পর্কিত কথা বলার অর্থ, ডানদিকে আমরা রাখতে পারি:

  • একটি উত্সযুক্ত টেবিল - একটি উপনামের সাথে সম্পর্কিত সম্পর্কযুক্ত উপকরণ হিসাবে
  • একটি টেবিলের মূল্যবান ফাংশন - পরামিতিগুলির সাথে একটি ধারণাগত ভিউ, যেখানে প্যারামিটারটি বাম দিকে উল্লেখ করতে পারে

উভয়ই একাধিক কলাম এবং সারি ফেরত দিতে পারে।


2

এটি সম্ভবত একটি পুরানো প্রশ্ন, তবে আমি এখনও যুক্তির পুনরায় ব্যবহারকে সহজ করার জন্য এবং ফলাফলগুলির জন্য "চেইনিং" ব্যবস্থা সরবরাহ করার জন্য ক্রস প্রয়োগের শক্তিটিকে পছন্দ করি।

আমি নীচে একটি এসকিউএল ফিডল সরবরাহ করেছি যা আপনি কোনও অগোছালো জিনিস না পেয়ে আপনার ডেটা সেটটিতে জটিল লজিক্যাল ক্রিয়াকলাপ সম্পাদন করতে কীভাবে ক্রস প্রয়োগ করতে পারবেন তার একটি সাধারণ উদাহরণ দেখায়। আরও জটিল গণনাগুলি এখান থেকে এক্সট্রোপোলেট করা কঠিন নয়।

http://sqlfiddle.com/#!3/23862/2


1

ক্রস অ্যাপ্লিকেশন নিয়োগকারী বেশিরভাগ অনুসন্ধানগুলিতে একটি অন্তর্ভুক্ত যোগদান করে পুনরায় লেখা যেতে পারে, ক্রস প্রয়োগ করে আরও কার্যকর প্রয়োগ পরিকল্পনা এবং আরও ভাল পারফরম্যান্স পাওয়া যায়, যেহেতু এটি যোগদানের আগেই সেটটিকে যোগদানের ক্ষেত্রে সীমাবদ্ধ করতে পারে।

এখানে থেকে চুরি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.