বাম যোগ দিয়ে শীর্ষে 1


96

নীচের ক্যোরিয়াকে প্রদত্ত একই মার্কার কী সহ dps_markers এ একাধিক সারি থাকতে পারে তবে আমরা কেবল প্রথমটির বিপরীতে যোগ দিতে চাই। যদি আমি এই ক্যোয়ারীটি নিয়ে যাই এবং শীর্ষ 1 এবং অর্ডার দ্বারা আমি সরিয়ে ফেলি তবে আমি এমবিজি.মার্কার_ভ্যালুয়ের জন্য একটি মান পাই তবে এটি চালানো কারণ এটি সর্বদা শূন্য হয়

SELECT u.id, mbg.marker_value 
FROM dps_user u
LEFT JOIN 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     ORDER BY m.creation_date
    ) MBG ON MBG.profile_id=u.id 
WHERE u.id = 'u162231993'

উত্তর:


204

বাম যোগদানের পরিবর্তে আউটার প্রয়োগ করুন:

SELECT u.id, mbg.marker_value 
FROM dps_user u
OUTER APPLY 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     WHERE um.profile_id=u.id 
     ORDER BY m.creation_date
    ) AS MBG
WHERE u.id = 'u162231993';

যোগদানের মতো নয়, অ্যাপ্লিকেশন আপনাকে অভ্যন্তরীণ ক্যোয়ারির অভ্যন্তরে u.id উল্লেখ করতে দেয়।


ধন্যবাদ @ রেমাস, এটি আমাকে সাহায্য করেছিল।
সার্থক শাহ

3

এগুলির মতো ডিবাগিং পরিস্থিতিগুলির চাবিকাঠিটি আউটপুটটি কী তা দেখার জন্য তার নিজস্ব নিজস্ব সাবকোরি / ইনলাইন ভিউ চালানো:

  SELECT TOP 1 
         dm.marker_value, 
         dum.profile_id
    FROM DPS_USR_MARKERS dum (NOLOCK)
    JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                AND dm.marker_key = 'moneyBackGuaranteeLength'
ORDER BY dm.creation_date

যে চলমান, আপনি দেখতে যে profile_idমান মেলেনি u.idমান u162231993যা ব্যাখ্যা করবে কেন কোনো mbgরেফারেন্স ফিরে আসবে null(বাম ধন্যবাদ যোগদানের তুমি কিছুই পাবে যদি এটি একটি ভেতরের যোগদানের ছিল)।

আপনি নিজেকে ব্যবহার করে একটি কোণে কোড করেছেন TOP, কারণ আপনি যদি অন্য ব্যবহারকারীদের জন্য এটি চালাতে চান তবে আপনাকে ক্যোয়ারীটি টুইট করতে হবে। একটি ভাল পদ্ধতির হবে:

   SELECT u.id, 
          x.marker_value 
     FROM DPS_USER u
LEFT JOIN (SELECT dum.profile_id,
                  dm.marker_value,
                  dm.creation_date
             FROM DPS_USR_MARKERS dum (NOLOCK)
             JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                         AND dm.marker_key = 'moneyBackGuaranteeLength'
           ) x ON x.profile_id = u.id
     JOIN (SELECT dum.profile_id,
                  MAX(dm.creation_date) 'max_create_date'
             FROM DPS_USR_MARKERS dum (NOLOCK)
             JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id 
                                         AND dm.marker_key = 'moneyBackGuaranteeLength'
         GROUP BY dum.profile_id) y ON y.profile_id = x.profile_id
                                   AND y.max_create_date = x.creation_date
    WHERE u.id = 'u162231993'

এটির সাহায্যে আপনি সিস্টেমের যে কোনও ব্যবহারকারীর জন্য রেকর্ড পরীক্ষা idকরতে whereক্লজটিতে মানটি পরিবর্তন করতে পারেন ।


2

কারণ TOP 1আদেশ উপ-ক্যোয়ারী থেকে নেই profile_id = 'u162231993' সরান where u.id = 'u162231993'এবং তারপর ফলাফল দেখুন।

কী চলছে তা বোঝার জন্য সাব-কোয়েরিটি আলাদাভাবে চালান।


ঠিক আছে আমি মনে করি আপনি এখন যা বলতে চাইছেন তা আমি দেখতে পাচ্ছি। এখনও এটি কাজ করতে সক্ষম হতে হবে। মূলত আমি টেবিলটি ডিপিএস_মার্কার টেবিলের একাধিক সারি থাকতে পারে যা বাইরের ক্যোয়ারিতে দ্বিধা সৃষ্টি করে যা আমাদের আটকাতে হবে।
dstarh

1

দামির সঠিক,

আপনার সাবকিউরিটি নিশ্চিত করতে হবে যে dps_user.id um.profile_id এর সমান, অন্যথায় এটি উপরের সারিটি ধরে ফেলবে যা সম্ভবত 'u162231993' এর আইডির সমান নয়

আপনার ক্যোয়ারীটি দেখতে এমন হওয়া উচিত:

SELECT u.id, mbg.marker_value 
FROM dps_user u
LEFT JOIN 
    (SELECT TOP 1 m.marker_value, um.profile_id
     FROM dps_usr_markers um (NOLOCK)
         INNER JOIN dps_markers m (NOLOCK) 
             ON m.marker_id= um.marker_id AND 
                m.marker_key = 'moneyBackGuaranteeLength'
     WHERE u.id = um.profile_id
     ORDER BY m.creation_date
    ) MBG ON MBG.profile_id=u.id 
WHERE u.id = 'u162231993'

4
হ্যাঁ, আমি কেবল এটি চেষ্টা করেছি কিন্তু উপ-নির্বাচনের মধ্যে ইউ.আইডি দৃশ্যমান নয় মাল্টি-পার্ট সনাক্তকারী "ইউ.আইডি" আবদ্ধ হতে পারে না।
dstarh

4
আপনি WHERE um.profile_id = 'u162231993'সাব-কোয়েরিতে এবং WHERE mbg.marker_value IS NOT NULLবাইরে রাখতে পারেন।
দামির সুদারেভিক

4
আমি প্রোফাইল_আইডিকে জানব না, এটি অন্য যুক্ত হতে হবে। এই অনেক বড় প্রশ্নের সাথে বাইরে টানা ছিল
dstarh

4
ভাল, ভেরিয়েবলটি ব্যবহার করুন @SearchFor = 'u162231993'এবং তারপরে এটি ব্যবহার করুন WHEREবা কিছু ডেটা এবং টেবিল কাঠামো পোস্ট করুন যাতে অন্যান্য লোকেরা এটির সাহায্য এবং চেষ্টা করে।
দামির সুদারেভিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.