আরও একটি সম্পর্কিত সম্পর্কযুক্ত subquery মত
একটি LATERALযোগদান (9.3 বা পরবর্তী পোস্টগ্রেস ) আরও একটি সম্পর্কিত সম্পর্কযুক্ত সাবকোয়ারির মতো , কোনও সরল সাবকোয়ারির মতো নয়। অ্যান্ডোমার যেমন উল্লেখ করেছে , একটি LATERALযোগদানের ডানদিকে একটি ক্রিয়া বা subquery এর প্রতিটি বামের জন্য একবারের সাথে একবার- সম্পর্কিত subquery- যেমন একটি সরল subquery (টেবিল এক্সপ্রেশন) একবার মূল্যায়ন করা হয় একবার মূল্যায়ন করতে হবে । (ক্যোয়ারী পরিকল্পনাকারীর
উভয়ের পক্ষে পারফরম্যান্স অনুকূল করার উপায় রয়েছে)) এই সম্পর্কিত উত্তরের একই সমস্যা সমাধানের জন্য উভয় পক্ষে কোডের উদাহরণ রয়েছে:
একাধিক কলাম ফেরত LATERALদেওয়ার জন্য , একটি যোগদান সাধারণত সাধারণত সহজ, পরিষ্কার এবং দ্রুত হয়।
এছাড়াও, মনে রাখবেন যে একটি সম্পর্কযুক্ত সাবকোয়ারির সমতুল্য হ'ল LEFT JOIN LATERAL ... ON true:
ম্যানুয়াল চালু করুন LATERAL
আমরা এখানে উত্তর দিতে যাব তার চেয়ে এটি বেশি প্রামাণিক:
সাবকিউরিটি যে কাজগুলি করতে পারে না
সেখানে হয় যে একটি LATERALযোগদানের করতে পারেন, কিন্তু একটি (সম্পর্কিত) subquery (সহজে) করতে পারেন না। একটি সম্পর্কযুক্ত সাবকোয়ারি কেবল একটি একক মান প্রদান করতে পারে, একাধিক কলাম নয় এবং একাধিক সারি নয় - খালি ফাংশন কলগুলি ব্যতীত (যার ফলে একাধিক সারি ফেরত দিলে ফল সারিগুলি বহুগুণ করে)। তবে এমনকি নির্দিষ্ট সেট-রিটার্নিং ফাংশনগুলি কেবল FROMক্লজে অনুমোদিত । unnest()Postgres 9.4 বা তারপরে একাধিক পরামিতিগুলির সাথে পছন্দ করুন । ম্যানুয়াল:
এটি কেবল ধারাতে অনুমোদিত FROM;
সুতরাং এটি কাজ করে তবে সহজেই সাবকিউয়ের সাথে প্রতিস্থাপন করা যায় না:
CREATE TABLE tbl (a1 int[], a2 int[]);
SELECT * FROM tbl, unnest(a1, a2) u(elem1, elem2); -- implicit LATERAL
ধারাটিতে কমা ( ,) এর FROMজন্য সংক্ষিপ্ত স্বরলিপি CROSS JOIN।
LATERALটেবিল ফাংশন জন্য স্বয়ংক্রিয়ভাবে ধরে নেওয়া হয়।
এর বিশেষ ক্ষেত্রে সম্পর্কে আরও UNNEST( array_expression [, ... ] ):
মধ্যে ফাংশন সেট করুন SELECTতালিকায়
আপনি পছন্দ করতে সেট ফিরে ফাংশন ব্যবহার করতে পারেন unnest()মধ্যে SELECTসরাসরি তালিকা। এটি SELECTপোস্টগ্রিস 9.6 পর্যন্ত একই তালিকায় এই জাতীয় একাধিক ফাংশনের সাথে অবাক করা আচরণ প্রদর্শন করত । তবে শেষ পর্যন্ত এটি পোস্টগ্রিস 10 দিয়ে স্যানিটাইজ করা হয়েছে এবং এটি এখন একটি বৈধ বিকল্প (এমনকি যদি স্ট্যান্ডার্ড এসকিউএল না হয়)। দেখা:
উপরের উদাহরণে বিল্ডিং:
SELECT *, unnest(a1) AS elem1, unnest(a2) AS elem2
FROM tbl;
তুলনা:
PG 9.6 জন্য dbfiddle এখানে
PG 10 এর জন্য dbfiddle এখানে
ভুল তথ্য পরিষ্কার করুন
ম্যানুয়াল:
জন্য INNERএবং OUTERযোগদানের ধরনের, একটি যোগদানের শর্ত উল্লেখ করা আবশ্যক, যথা ঠিক এক NATURAL, ON join_condition , অথবা USING( join_column [...])। অর্থের জন্য নীচে দেখুন।
কারণ CROSS JOIN, এই ধারাগুলির কোনওটিই উপস্থিত হতে পারে না।
সুতরাং এই দুটি ক্যোয়ারী বৈধ (বিশেষত দরকারী না হলেও):
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t ON TRUE;
SELECT *
FROM tbl t, LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
যদিও এটি এক নয়:
SELECT *
FROM tbl t
LEFT JOIN LATERAL (SELECT * FROM b WHERE b.t_id = t.t_id) t;
কেন এটা @ Andomar এর কোড উদাহরণস্বরূপ সঠিক ( CROSS JOINএকটি শর্ত যোগ দিতে প্রয়োজন হয় না) এবং @ Attila এর হয় অবৈধ ছিল।
applyহিসাবে একইlateralএসকিউএল মান থেকে)