সিটিই এবং সিটিই (<কলাম / নাম>>) এর সাথে পার্থক্য কী?


11

এমএসডিএন-তে প্রচলিত সারণী এক্সপ্রেশনগুলি ব্যবহার করে দেখানো হয়েছে , আপনি কোনও সিটিই হিসাবে সংজ্ঞায়িত করতে পারেন:

WITH expression_name [ ( column_name [,...n] ) ]
AS
( CTE_query_definition )

এবং এটি ব্যবহার করুন:

SELECT <column_list> FROM expression_name;

ধরা যাক আমার 2 টি সিটিই অনুসরণ করেছে

with cte1 as(
select name from Table1
)

with cte2(name) as(
select name from Table1
)

একটি কোয়েরি উভয় সিটিইর জন্য একই ফলাফলকে আভ্যন্তরীণ কোয়েরি হিসাবে একই ফলাফল দেয়। এই দুটিয়ের মধ্যে কেবলমাত্র পার্থক্য হ'ল cte2 এর কলামে নাম ( (name)) এর ঘোষণায় সংজ্ঞায়িত হয়েছে।

আমি যখন উভয় সিটিই কার্যকর করি, তখন আমি কার্যকর করার পরিকল্পনার কোনও পার্থক্য দেখি না।

আমি জানতে আগ্রহী:

  • আমি সিটিই সংজ্ঞায় কোনও কলামের নাম উল্লেখ না করলে কী পার্থক্য হবে?
  • সিটিই তৈরি করার সময় আমার কেন কলামের নাম উল্লেখ করা উচিত?
  • এটি কি কোনও সুযোগের দ্বারা ক্যোয়ারি এক্সিকিউশন প্ল্যানকে প্রভাবিত করে? (আমি যতদূর দেখেছি, এতে কোনও পার্থক্য নেই))

উত্তর:


25

আপনার কাছে ইতিমধ্যে ইতিমধ্যে আপনার একটি প্রশ্নের উত্তর রয়েছে।

ইন দুটিই MSDN পৃষ্ঠা, একটি লাইন সরাসরি আপনার উদ্ধৃতি পর যে এই ব্যাখ্যা হল:

সিটিইর জন্য প্রাথমিক সিনট্যাক্স কাঠামোটি হ'ল:

এক্সপ্রেশন_নামের সাথে [(কলাম_নাম [, ... n])]

আঃ

(CTE_query_definition)

সমস্ত ফলাফলের কলামগুলির জন্য পৃথক নাম ক্যোরি সংজ্ঞাতে সরবরাহ করা হলে কলামের নামের তালিকাটি কেবল alচ্ছিক।

(সামনে জোর দাও)

এর অর্থ হ'ল আপনাকে কয়েকটি পরিস্থিতিতে কলামের নাম নির্দিষ্ট করতে হবে:

  • এটি কাজ করবে:

    WITH [test_table] ([NoName], [CAST], [Function]) 
    AS
    (
        SELECT 
            1
          , CAST('1' AS CHAR(1))
          , dbo.CastToChar(1)
    )
    SELECT * FROM [test_table];
  • এটি যেমন:

    WITH [test_table]  
    AS
    (
        SELECT 
            1 as [NoName]
          , CAST('1' AS CHAR(1)) as [CAST]
          , dbo.CastToChar(1) as [Function]
    )
    SELECT * FROM [test_table];
  • এটি কলামগুলির স্বতন্ত্র নাম না হিসাবে এটি করবে না:

    WITH [test_table] 
    AS
    (
        SELECT 
            1
          , CAST('1' AS CHAR(1))
          , dbo.CastToChar(1)
    )
    SELECT * FROM [test_table];

1
মূলত, কলাম ব্যতীত সংস্করণটি এসকিউএল ব্যতীত কলামের সংস্করণের মতোই কোয়েরি থেকে কলামের নামগুলি "অনুমান" করতে হয়।
কুতুলু মাইক 23

10

উপাখ্যান্তভাবে, আমি সিটিই-র ভিতরে WITH CTE (xxx) AS1 টি ধারাটির পরিবর্তে কলামগুলির নাম রাখতে পছন্দ করি কারণ আপনি অজান্তে কলামের সামগ্রীগুলির সাথে বনামের নামগুলি মেলে না।

উদাহরণস্বরূপ নিম্নলিখিত উদাহরণটি ধরুন:

;WITH MyCTE (x, y)
AS 
(
    SELECT mt.y
         , mt.x
    FROM MySchema.MyTable mt
)
SELECT MyCTE.x
     , MyCTE.y
FROM MyCTE;

এই প্রদর্শন কি? এটি yশিরোনামের অধীনে কলামের xবিষয়বস্তু xএবং শিরোনামের নীচে কলামের বিষয়বস্তু প্রদর্শন করে y

এই উপলব্ধির সাথে, আমি কখনই ধারাটিতে কলামের নামগুলি নির্দিষ্ট করি না(xxx) AS , পরিবর্তে আমি এটি এটি করি:

;WITH MyCTE
AS 
(
    SELECT Alias1 = mt.y
         , Alias2 = mt.x
    FROM MySchema.MyTable mt
)
SELECT MyCTE.Alias1
     , MyCTE.Alias2
FROM MyCTE;

এটি কলাম সংজ্ঞাগুলি কী তা সম্পর্কে সমস্ত সন্দেহ দূর করে।

সম্পূর্ণ অপ্রাসঙ্গিক পার্শ্ব-নোটে; অবজেক্টের নাম উল্লেখ করার সময় সর্বদা স্কিমা নাম উল্লেখ করুন এবং আপনার বিবৃতিটি অর্ধ-কোলন দিয়ে শেষ করুন


7

শেষ পর্যন্ত প্রতিটি কলামের একটি বৈধ নাম প্রয়োজন এবং আপনি এটি দুটি উপায়ে অর্পণ করতে পারেন:

  1. কলামের তালিকা

    ;WITH cte (foo)
    AS
    ( select col from tab )
    select foo from cte;
  2. মূল কলামের নাম বা ডাকনাম ব্যবহার করা

    ;WITH cte
    AS
    ( select col from tab )
    select col from cte;

আপনি যখন উভয় উপনাম এবং কলামের তালিকা করেন

  1. উভয় কলামের তালিকা এবং উপাধি

    ;WITH cte (foo, bar)
    AS
    ( select col1         -- not valid in outer Select
             col2 as colx -- not valid in outer Select
      from tab )
    select foo, bar from cte;

এটি একটি ভিউ বা একটি উত্পন্ন টেবিলের সংজ্ঞার সাথে সমান, যেখানে আপনি কলামের নামের তালিকাও নির্দিষ্ট করতে পারেন।

কলাম তালিকা : যখন আপনার কাছে জটিল জটিল গণনা থাকে তবে নামটি চিহ্নিত করা সহজ easier কারণ তারা উত্স কোডের মাধ্যমে ছড়িয়ে ছিটিয়ে নেই। আপনি যদি পুনরাবৃত্তিযোগ্য সিটি পেয়ে থাকেন তবে এটি আরও সহজ এবং আপনি # 3 এ একই কলামের জন্য দুটি পৃথক নাম নির্ধারণ করতে পারেন।

আসল নাম / উপনাম : আপনি কেবলমাত্র একটি উলাম ব্যবহার করতে হবে যদি আপনি কোনও গণনা করেন বা কলামটির নতুন নামকরণ করতে চান


1
"স্পট করা সহজ" সম্ভবত কিছুটা বিষয়গত। আমি SomeAlias = SomeFunction(SomeColumn)লাইনে প্রতি একক কলাম সংজ্ঞা সহ লাইনের শুরুতে কলামের নাম রাখতে পছন্দ করি । এটি আপনি সন্ধান করছেন তা সনাক্ত করতে কলাম তালিকার বাম দিকে একটি সাধারণ স্ক্যান করতে দেয়।
ম্যাক্স ভার্নন

1
@ ম্যাক্স ভার্নন: এটি ঠিক, একাধিক লাইনের বিস্তৃতি গণনার মধ্যে ফাঁকা রেখা যুক্ত করাও সহায়তা করে। আসলে আমি বেশিরভাগ কলামের তালিকাটিও বাদ দিয়ে থাকি ...
no

2
মজার যে আপনি মতামত উল্লেখ করেছেন। আমি যেমন কখনও ভিউ হিসাবে সংজ্ঞায়িত করি তখন কখনও ভিউ নামের পরে কলাম তালিকাটি ব্যবহার করি নি CREATE VIEW SomeView (ColA, ColB, …) AS …। এখন যে বিষয়টি আপনি এনেছেন, আমি তার মতো দৃশ্যের কথা ভাবছি CREATE VIEW MyView (G) AS WITH cte (C) AS (SELECT A AS B FROM MyTable) SELECT E AS F FROM (SELECT C AS D FROM cte) AS s (E);- এটি ডিবাগ করার জন্য কী আনন্দ হবে!
অ্যান্ড্রি এম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.