আমি কি জয়েন অবস্থায় ক্যাসেটের স্টেটমেন্ট ব্যবহার করতে পারি?


140

নিম্নলিখিত চিত্রটি মাইক্রোসফ্ট এসকিউএল সার্ভার ২০০৮ আর 2 সিস্টেম দর্শনের একটি অংশ। ইমেজ থেকে আমরা দেখতে পাচ্ছি যে এর মধ্যে সম্পর্ক sys.partitionsএবং sys.allocation_unitsএর মান নির্ভর করে sys.allocation_units.type। সুতরাং তাদের একসাথে যোগদান করতে আমি এই জাতীয় কিছু লিখব:

SELECT  *
FROM    sys.indexes i
        JOIN sys.partitions p
            ON i.index_id = p.index_id 
        JOIN sys.allocation_units a
            ON CASE
               WHEN a.type IN (1, 3)
                   THEN a.container_id = p.hobt_id 
               WHEN a.type IN (2)
                   THEN a.container_id = p.partition_id
               END 

তবে উপরের কোডটি একটি সিনট্যাক্স ত্রুটি দেয়। আমার ধারণা এটি CASEবিবৃতিটির কারণেই । কেউ কি একটু ব্যাখ্যা করতে সাহায্য করতে পারেন?


ত্রুটি বার্তা যুক্ত করুন:

এমএসজি 102, স্তর 15, রাজ্য 1, লাইন 6 '=' এর নিকটে ভুল সিনট্যাক্স।

এই ইমেজ


36
এই সুন্দর ডিবি ডায়াগ্রামটি তৈরি করতে আপনি কোন সফ্টওয়্যার ব্যবহার করেছেন?
শিখুনবাইআরডিং ২

2
@LearnByReading আপনি কি কোন সফ্টওয়্যার ব্যবহার করা হয়েছে তা খুঁজে পেয়েছেন?
ব্যবহারকারীর 632716

1
@ ব্যবহারকারীর 632716 দুর্ভাগ্যক্রমে না!
শিখুনবাইরেডিং

2
@ ব্যবহারকারী 632716 যদিও আমি সত্যিই মনে করি এটি মাইএসকিউএল ওয়ার্কবেঞ্চ ছিল। তবে আমি কখনই কোনও প্রতিক্রিয়া পাইনি
শিখবাইরেইডিং

@LearnByReading আমার কোন ধারণা নেই। এটি মাইক্রোসফ্ট সরবরাহ করেছে।
একজন শিক্ষার্থী

উত্তর:


222

একটি CASEঅভিব্যক্তি THENধারাটির অংশ থেকে একটি মান প্রদান করে। আপনি এটি এভাবে ব্যবহার করতে পারেন:

SELECT  * 
FROM    sys.indexes i 
    JOIN sys.partitions p 
        ON i.index_id = p.index_id  
    JOIN sys.allocation_units a 
        ON CASE 
           WHEN a.type IN (1, 3) AND a.container_id = p.hobt_id THEN 1
           WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
           ELSE 0
           END = 1

মনে রাখবেন আপনি ফিরে মান কিছু করতে 1. আপনার বিবরণ এটি তুলনা প্রয়োজন, যেমন সমতার জন্য একটি কাজ বা পরীক্ষা মান ফেরত পাঠাতে, তন্ন তন্ন যার একটি প্রেক্ষাপটে জানার জন্য চেষ্টা CASE/ THENদফা। (যদি BOOLEANকোনও ডেটাটাইপ থাকে তবে সাম্যের জন্য পরীক্ষাটি বোঝা যাবে))


@ হ্যাবো ধন্যবাদ যা আমার পক্ষে কাজ করেছে ... তবে সমস্যাটি যখন আমি এই পরিস্থিতিতে করি তখন পরিস্থিতি হ্রাস পাচ্ছে ... দয়া করে আমাকে বলুন আমি কীভাবে এটি ভেঙে ফেলছি?
সাগর টান্ডেল

1
@ সাগরটানডেল - দুঃখিত, আমি বুঝতে পারি না "এর মধ্য দিয়ে পড়া" এবং "আমি কীভাবে এটি ভেঙে দেব"। আপনি আপনার মন্তব্য স্পষ্ট করতে পারেন? (সম্প্রতি সাবার ডাইভ থেকে প্রকাশিত হয়েছে।
নাইট্রক্স

এটি আমি চাই না এমন সমস্ত শর্তগুলির জন্য এটি পরীক্ষা করে। আমি চাই এটি শর্তের সাথে মিলে গেলে মামলাটি ছেড়ে দেওয়া উচিত।
সাগর টান্ডেল

3
@ সাগরটানডেল - এমএসডিএন থেকে : " সিএসই বিবৃতি তার শর্তগুলি ক্রমানুসারে মূল্যায়ন করে এবং যার শর্তটি সন্তুষ্ট হয় প্রথম শর্তে থেমে যায়।" আপনি যোগদান সারি যে স্পষ্টভাবে বিবৃত অবস্থার সাথে মেলে না, শুধু থেকে লেজ শেষ পরিবর্তন সব চান = 1জন্য = 0, কিন্তু আমি মনে করি আপনি ফলাফলের পছন্দ করবেন না।
HABO

যোগদান করুন.অলোকেশন_একবারের মতো (1, 3) টাইপ করুন এবং a.container_id = p.hobt_id যখন 1 টি টাইপ করুন ইন (2) এবং a.container_id = p.partition_id তত 1 আগে 0 সমাপ্তি = 1 আপনি কি আপনার সমাধানের উপরের
অংশটিকে এন্টি

36

পরিবর্তে, আপনি কেবল উভয় টেবিলের সাথে যোগ দিন এবং আপনার নির্বাচন বিভাগে মেলে এমন একটি থেকে ডেটা ফেরান:

আমি আপনাকে এই লিঙ্কটি দিয়ে যাওয়ার পরামর্শ দিচ্ছি শর্তসাপেক্ষে এসকিউএল সার্ভারে যোগ দিন এবং টি-এসকিউএল কেস স্টেটমেন্টটি ক্লোজ অন জয়েন্ট ইন

যেমন

    SELECT  *
FROM    sys.indexes i
        JOIN sys.partitions p
            ON i.index_id = p.index_id 
        JOIN sys.allocation_units a
            ON a.container_id =
            CASE
               WHEN a.type IN (1, 3)
                   THEN  p.hobt_id 
               WHEN a.type IN (2)
                   THEN p.partition_id
               END 

সম্পাদনা: মতামত অনুসারে।

আপনি করছেন হিসাবে আপনি যোগদানের শর্তটি নির্দিষ্ট করতে পারবেন না .. উপরের ক্যোয়ারীটি পরীক্ষা করুন যাতে কোনও ত্রুটি নেই। আমি সাধারণ কলামটি বের করেছি এবং ডান কলামের মানটি শর্তে মূল্যায়ন করা হবে।


1
conditional joinমানে কি ? প্রতিটি যোগদান (ক্রস বাদে) শর্তযুক্ত। এই মামলাটি অন্য যে কোনও চেয়ে আলাদা কীভাবে? আপনার নমুনার শর্তের সাথে অভ্যন্তরীণ যোগদান রয়েছে, পাশাপাশি শর্তের সাথে ওপিএস কোয়েরিও যোগদান করেছে।
zerkms

@ জারকিমস: আমি একমত, এটি বিভ্রান্তিকর শোনায়। আমি বিশ্বাস করি, এই প্রসঙ্গে শর্তযুক্ত যোগদানের অর্থ একটি যুক্ত হওয়া যার শর্তটি অন্য শর্তের উপর নির্ভর করে।
অ্যান্ড্রি এম

@ অ্যান্ড্রি এম: তুচ্ছ অবস্থার জন্য অন্য পদটি ভাবার কোনও কারণ OR?
zerkms

@ জারকিমস: এর, হ্যাঁ, কারণ এটি বিভ্রান্তিকর বলে মনে হচ্ছে। :) তবে আমি বিশ্বাস করি যে আপনি জিজ্ঞাসা করতে চেয়েছিলেন এমন কোনও কারণ আছে যা অন্য কোনও পদ সম্পর্কে চিন্তা না করে, এই ক্ষেত্রে আমি নিশ্চিত হতে পারি না। আপনি যদি আমার কারণ জিজ্ঞাসা করেন , ভাল, আমি মনে করি আমি কেবল যথেষ্ট বিরক্ত হতে পারি না। :) বিকল্প অবস্থার সাথে যোগদানের কীভাবে ? আমি ভয় করি যে আমি কয়েনিংয়ের শর্তে খুব ভাল নই। দ্রষ্টব্য, যদিও, ধারণাটিগতভাবে এটি "শর্তাধীন" সম্পর্কে নয়, "শর্ত সহ OR" সম্পর্কে নয় । ORএটি প্রয়োগের একমাত্র উপায় ব্যবহার করা।
অ্যান্ড্রি এম

@ অ্যান্ড্রি এম: ঠিক আছে। তবে ব্যক্তিগতভাবে আমি এখনও 1 এবং 2 বা 1 দিয়ে তুচ্ছ অবস্থার নাম দেওয়ার কারণ দেখতে পাচ্ছি না । এটি একটি রুটিন ক্যোয়ারী যার এমন কোনও কিছুই নেই যা একে অন্যের থেকে পৃথক করে। ORANDsCASE
zerkms

17

এটা চেষ্টা কর:

...JOIN sys.allocation_units a ON 
  (a.type=2 AND a.container_id = p.partition_id)
  OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)

যদিও এটি কাজ করবে - প্রশ্নের ক্যোয়ারী পুরোপুরি বৈধ বলে মনে হচ্ছে। সুতরাং এখনও ওপি-র কোডে কী কী তা ব্যাখ্যা করে না
জের্কम्स

10

আমি মনে করি আপনার দুটি কেস স্টেটমেন্ট দরকার:

SELECT  *
FROM    sys.indexes i
    JOIN sys.partitions p
        ON i.index_id = p.index_id 
    JOIN sys.allocation_units a
        ON 
        -- left side of join on statement
            CASE
               WHEN a.type IN (1, 3)
                   THEN a.container_id
               WHEN a.type IN (2)
                   THEN a.container_id
            END 
        = 
        -- right side of join on statement
            CASE
               WHEN a.type IN (1, 3)
                   THEN p.hobt_id
               WHEN a.type IN (2)
                   THEN p.partition_id
            END             

এই কারণ:

  • CASE বিবৃতিটি শেষে একটি একক মান প্রদান করে
  • অন ​​স্টেটমেন্ট দুটি মান তুলনা করে
  • আপনার ক্ষেত্রে বিবৃতি তুলনা করছেন ভিতরে ক্ষেত্রে বিবৃতির। আমি অনুমান করব যে আপনি যদি আপনার নির্বাচনী ক্ষেত্রে CASE স্টেটমেন্ট রাখেন তবে আপনি একটি বুলিয়ান '1' বা '0' পাবেন যা সিএসএসের বিবৃতিটি সত্য বা মিথ্যা হিসাবে মূল্যায়ন করেছে কিনা তা নির্দেশ করে

5

আমি আপনার উদাহরণ গ্রহণ করেছি এবং এটি সম্পাদনা করেছি:

SELECT  *
FROM    sys.indexes i
    JOIN sys.partitions p
        ON i.index_id = p.index_id 
    JOIN sys.allocation_units a
        ON a.container_id = (CASE
           WHEN a.type IN (1, 3)
               THEN p.hobt_id 
           WHEN a.type IN (2)
               THEN p.partition_id
           ELSE NULL
           END)

1

এটা দুর্দান্ত লাগছে

https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition

FROM YourMainTable
LEFT JOIN AirportCity DepCity ON @TravelType = 'A' and DepFrom =  DepCity.Code
LEFT JOIN AirportCity DepCity ON @TravelType = 'B' and SomeOtherColumn = SomeOtherColumnFromSomeOtherTable

এটি চেষ্টা করে আমি একটি ত্রুটি পাচ্ছি: পারস্পরিক সম্পর্কের নাম 'xx' এফআরওএম ক্লজে একাধিকবার নির্দিষ্ট করা হয়েছে।
এটিয়েন

1

হ্যা, তুমি পারো. এখানে একটি উদাহরণ।

SELECT a.*
FROM TableA a
LEFT OUTER JOIN TableB j1 ON  (CASE WHEN LEN(COALESCE(a.NoBatiment, '')) = 3 
                                THEN RTRIM(a.NoBatiment) + '0' 
                                ELSE a.NoBatiment END ) = j1.ColumnName 

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

0

ডনকংয়ের উদাহরণ নিয়েছিল।

ইস্যুটি আমার একটি ঘোষিত ভেরিয়েবল ব্যবহার করা দরকার। এটি আপনাকে যা তুলনা করতে হবে তার বাম এবং ডানদিকে উল্লেখ করার অনুমতি দেয়। এটি কোনও এসএসআরএস রিপোর্টকে সমর্থন করার জন্য যেখানে ব্যবহারকারীর দ্বারা নির্বাচনের ভিত্তিতে বিভিন্ন ক্ষেত্রকে সংযুক্ত করা আবশ্যক।

প্রাথমিক ক্ষেত্রে নির্বাচনের উপর ভিত্তি করে ক্ষেত্র পছন্দ নির্ধারণ করে এবং তারপরে যোগদানের জন্য আমার যে ফিল্ডটি ম্যাচ করতে হবে তা সেট করতে পারি।

ভেরিয়েবলটি যদি বিভিন্ন ক্ষেত্র থেকে চয়ন করার প্রয়োজন হয় তবে ডান হাতের জন্য একটি দ্বিতীয় কেস স্টেটমেন্ট যুক্ত করা যেতে পারে

LEFT OUTER JOIN Dashboard_Group_Level_Matching ON
       case
         when @Level  = 'lvl1' then  cw.Lvl1
         when @Level  = 'lvl2' then  cw.Lvl2
         when @Level  = 'lvl3' then  cw.Lvl3
       end
    = Dashboard_Group_Level_Matching.Dashboard_Level_Name

0

এখানে আমি দুটি ভিন্ন ফলাফলের সেটগুলির মধ্যে পার্থক্যটি তুলনা করেছি:

SELECT main.ColumnName, compare.Value PreviousValue,  main.Value CurrentValue
FROM 
(
    SELECT 'Name' AS ColumnName, 'John' as Value UNION ALL
    SELECT 'UserName' AS ColumnName, 'jh001' as Value UNION ALL
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
    SELECT 'Phone' AS ColumnName, NULL as Value UNION ALL
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
    SELECT 'IsActive' AS ColumnName, '1' as Value
) main
INNER JOIN
(
    SELECT 'Name' AS ColumnName, 'Rahul' as Value UNION ALL
    SELECT 'UserName' AS ColumnName, 'rh001' as Value UNION ALL
    SELECT 'Department' AS ColumnName, 'HR' as Value UNION ALL
    SELECT 'Phone' AS ColumnName, '01722112233' as Value UNION ALL
    SELECT 'DOB' AS ColumnName, '1993-01-01' as Value UNION ALL
    SELECT 'CreateDate' AS ColumnName, '2017-01-01' as Value UNION ALL
    SELECT 'IsActive' AS ColumnName, '1' as Value
) compare
ON main.ColumnName = compare.ColumnName AND
CASE 
    WHEN main.Value IS NULL AND compare.Value IS NULL THEN 0
    WHEN main.Value IS NULL AND compare.Value IS NOT NULL THEN 1
    WHEN main.Value IS NOT NULL AND compare.Value IS NULL THEN 1
    WHEN main.Value <> compare.Value THEN 1
END = 1 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.