পোস্টগ্র্রেসে [FROM x, y] এর অর্থ কী?


12

আমি সবে পোস্টগ্র্রেস দিয়ে শুরু করছি। এই দস্তাবেজটি পড়ার পরে আমি এই প্রশ্নটি পেয়েছি:

SELECT title, ts_rank_cd(textsearch, query) AS rank
FROM apod, to_tsquery('neutrino|(dark & matter)') query
WHERE query @@ textsearch
ORDER BY rank DESC
LIMIT 10;

আমি এই প্রশ্নের সাথে সবকিছু বুঝতে পারেন, ছাড়া এই জন্য: FROM apod, ...

এর ,অর্থ কী? আমি যোগদান করতে অভ্যস্ত কিন্তু FROMকমা দ্বারা পৃথক একাধিক বিবৃতি না ।

আমি কোনও লাভের জন্য নেটটি অনুসন্ধান করেছিলাম। এটি দেখার পরে এবং চিন্তাভাবনা করার পরে, আমার কাছে মনে হচ্ছে এটি কোয়েরি নামক একটি ভেরিয়েবল ঘোষণা করছে যাতে এটি এটি একাধিকবার ব্যবহার করতে পারে। তবে এটি যদি সত্য হয় তবে এর সাথে FROMকী করার আছে ?

উত্তর:


10

এটি একটি অন্তর্নিহিত সৃষ্টি করে CROSS JOIN। এটি এসকিউএল -৯৯ সিনট্যাক্স।

এখানে আমি নিছক উদাহরণ হিসাবে pseduo- সারণী (মান সারণী) তৈরি values(1)এবং ব্যবহার values(2)করতে। জিনিস তাদের পরে t(x), এবং g(y)বলা হয় করছে FROM-ওরফে প্রথম বন্ধনী ভিতরে চরিত্র কলাম (জন্য ওরফে হয় xএবং yযথাক্রমে)। এটি পরীক্ষা করার জন্য আপনি ঠিক একটি টেবিল তৈরি করতে পারেন।

SELECT *
FROM (values(1)) AS t(x), (values(2)) AS g(y)

আপনি এখন এটি কীভাবে লিখবেন তা এখানে।

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(2)) AS g(y);

সেখান থেকে আপনি INNER JOINশর্তসাপেক্ষ যোগ করে এটি অন্তর্ভুক্ত করতে পারেন ।

SELECT *
FROM (values(1)) AS t(x)
CROSS JOIN (values(1)) AS g(z)
WHERE x = z;

বা স্পষ্ট এবং নতুন INNER JOINসিনট্যাক্স,

SELECT *
FROM (values(1)) AS t(x)
INNER JOIN (values(1)) AS g(z)
  ON ( x = z );

সুতরাং আপনার উদাহরণে ..

FROM apod, to_tsquery('neutrino|(dark & matter)') query

এটি মূলত নতুন সিনট্যাক্সের সমান,

FROM apod
CROSS JOIN to_tsquery('neutrino|(dark & matter)') AS query

যা আসলে একইরকম, এক্ষেত্রে, কারণ to_tsquery()একটি সারি দেয় এবং সেট হিসাবে নয়,

SELECT title, ts_rank_cd(
  textsearch,
  to_tsquery('neutrino|(dark & matter)')
) AS rank
FROM apod
WHERE to_tsquery('neutrino|(dark & matter)') @@ textsearch
ORDER BY rank DESC
LIMIT 10;

তবে to_tsquery('neutrino|(dark & matter)')উপরেরটি দু'বারের সম্ভাব্য কারণ হতে পারে, তবে এই ক্ষেত্রে তা হয় না - to_tsqueryএটি স্ট্যাবল হিসাবে চিহ্নিত হয় (এর সাথে যাচাই করা হয় \dfS+ to_tsquery)।

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

এসকিউএল -৯৯ এবং এসকিউএল -৯৯ এর মধ্যে পার্থক্যগুলির আরও সম্পূর্ণ তুলনা করার জন্য, আমার উত্তরটি এখানেও দেখুন


আপনাকে অনেক ধন্যবাদ. আমি শুধু এসকিউএল দিয়ে শুরু করছি। এটি ,কেবল একটি কার্টেসিয়ান পণ্য হিসাবে ক্রস যোগ হওয়ার জন্য অর্থবোধ করে এবং এর সাথে কোনও তুলনা জড়িত না। আপনি কি আরও 1 টি প্রশ্নের উত্তর দিতে পারেন প্লিজ? কি t(x)আছে (values(1)) AS t(x)???
andrerpena

@andrerpena আপডেট হয়েছে।
ইভান ক্যারল

1
তুমিই শ্রেষ্ঠ. ক্রিস্টাল স্পষ্ট ব্যাখ্যা। অসংখ্য ধন্যবাদ.
andrerpena

কোনও টেবিলে ওরফে "FROM ওরফে" শব্দটি কখনও শুনেনি । to_tsquery()একটি ফেরৎ মান নয় সারি । এবং শুধু কারণ একটি ফাংশন সংজ্ঞায়িত করা হয় STABLE, তার মানে এই নয় ক্যোয়ারী পরিকল্পক হবে পুনরাবৃত্তি মূল্যায়ন এড়ানো। এটা পারে
এরউইন ব্র্যান্ডস্টেটার

12

ম্যানুয়ালটিতে সারণী প্রকাশের অধ্যায়টির তালিকায় কমাটিরFROM জন্য বিশদ ব্যাখ্যা রয়েছে :

FROMধারা কমা দ্বারা পৃথক করা টেবিল রেফারেন্স তালিকা দেওয়া অন্যান্য এক বা একাধিক টেবিল থেকে একটা টেবিল আহরিত।

FROM table_reference [, table_reference [, ...]]

টেবিলের রেফারেন্সটি কোনও টেবিলের নাম (সম্ভবত স্কিমা-যোগ্য) হতে পারে, বা একটি উপকরণ, একটি JOINনির্মাণ বা এইগুলির জটিল সংমিশ্রণগুলির মতো উত্পন্ন টেবিল । যদি একাধিক টেবিলের রেফারেন্সটি FROMক্লজটিতে তালিকাভুক্ত করা হয় , সারণীগুলি ক্রস-যুক্ত হয় (যা তাদের সারিগুলির কার্টেসিয়ান পণ্য তৈরি হয়; নীচে দেখুন)।

স্পষ্টত JOINসিনট্যাক্সের চেয়ে এসকিউএল স্ট্যান্ডার্ডের পূর্ববর্তী সংস্করণে কমা-বিভাজিত টেবিলের রেফারেন্সগুলি সংজ্ঞায়িত করা হয়েছে যে কমাটি ভুল বা পুরানো হয়ে ওঠে না । সুস্পষ্ট যোগদানের বাক্য গঠনটি ব্যবহার করুন, যেখানে এটি প্রযুক্তিগতভাবে প্রয়োজনীয় (নীচে দেখুন) বা যেখানে এটি কোয়েরি পাঠ্যকে পরিষ্কার করে তোলে।

ম্যানুয়াল আবার:

FROM T1 CROSS JOIN T2সমান FROM T1 INNER JOIN T2 ON TRUE (নীচে দেখুন)। এটিও সমান FROM T1, T2

তবে "সমতুল্য" অর্থ অভিন্ন নয়ম্যানুয়াল নোট হিসাবে একটি সূক্ষ্ম পার্থক্য আছে :

দ্রষ্টব্য
এই দ্বিগুণ সমতাটি যখন JOINদুটিরও বেশি টেবিল প্রদর্শিত হয় ঠিক তখনই ধরে না, কারণ কমা থেকে বেশি শক্ত করে আবদ্ধ। উদাহরণস্বরূপ FROM T1 CROSS JOIN T2 INNER JOIN T3 ON conditionএকই নয় FROM T1, T2 INNER JOIN T3 ON conditionকারণ প্রথম ক্ষেত্রে conditionরেফারেন্স দিতে পারে T1তবে দ্বিতীয়টি নয়।

এই সম্পর্কিত প্রশ্ন পার্থক্যের প্রাসঙ্গিকতা প্রদর্শন করে:

মূলত, আপনার পর্যবেক্ষণটি ঠিক সঠিক:

আমার কাছে মনে হচ্ছে এটি ক্যোয়ারী নামক একটি ভেরিয়েবল ঘোষণা করছে যাতে এটি এটি একাধিকবার ব্যবহার করতে পারে।

যে কোনও ফাংশন তালিকায় "টেবিল ফাংশন" হিসাবে ব্যবহার করা যেতে পারে FROM। এবং ফাংশন প্যারামিটারগুলি সমস্ত টেবিল থেকে ফাংশনের বামে কলামগুলি উল্লেখ করতে পারে, কারণ স্বরলিপি:

FROM apod, to_tsquery('neutrino|(dark & matter)') query

সত্যিই এর সমতুল্য:

FROM apod CROSS JOIN LATERAL to_tsquery('neutrino|(dark & matter)') AS query

LATERAL প্রশ্নের উপর ম্যানুয়াল:

সারণী ফাংশনগুলির উপস্থিতিতে FROMকী শব্দটির আগেও ব্যবহার করা যেতে পারে LATERALতবে ফাংশনগুলির জন্য মূল শব্দটি alচ্ছিক ; ফাংশনের আর্গুমেন্টে যে কোনও ক্ষেত্রে FROM আইটেমের পূর্ববর্তী সরবরাহকৃত কলামগুলির উল্লেখ থাকতে পারে।

বোল্ড জোর আমার।

শব্দAS সম্পূর্ণরূপে সামনে ঐচ্ছিক গোলমাল টেবিল alias লেখা (যেমন বিরোধিতা কলাম alias লেখা , যেখানে এটি বর্জন করতে না সুপারিশ করা হচ্ছে ASসম্ভাব্য অস্পষ্টতা এড়াতে)। আরও সঙ্গে সম্পর্কিত উত্তর:

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