কীভাবে একাধিক কলামগুলিতে একটি অন্তর্ভুক্ত যোগদান করবেন


168

আমি একটি হোমওয়ার্ক প্রকল্পে কাজ করছি এবং আমার একটি ডাটাবেস ক্যোয়ারী করানোর কথা ছিল যা শহরের নাম বা বিমানবন্দর কোড দ্বারা ফ্লাইটগুলি সন্ধান করে তবে flightsটেবিলটিতে কেবল বিমানবন্দর কোড থাকে তাই যদি আমি শহর থেকে অনুসন্ধান করতে চাই তবে এ যোগ airportsটেবিল।

বিমানবন্দর টেবিল নিম্নলিখিত কলাম রয়েছে: code, city
বিমান টেবিল নিম্নলিখিত কলাম রয়েছে: airline, flt_no, fairport, tairport, depart, arrive, fare
কলাম fairportএবং tairportহয় থেকে এবং থেকে এয়ারপোর্ট কোড রয়েছে।
কলামগুলি departএবং arriveপ্রস্থান এবং আগমনের তারিখ।

আমি একটি ক্যোয়ারী নিয়ে এসেছি যা fairportকলাম এবং কলামে প্রথম ফ্লাইটগুলিতে যোগ দেয় airports.code। আমার সাথে ম্যাচ করার জন্য আমাকে tairportপ্রথম যোগদান থেকে পূর্বের ম্যাচগুলিতে আরও একটি যোগদান করতে হবে।

SELECT airline, flt_no, fairport, tairport, depart, arrive, fare
    FROM (SELECT * FROM flights
        INNER JOIN airports
        ON flights.fairport = airports.code
        WHERE (airports.code = '?' OR airports.city='?')) AS matches
    INNER JOIN airports
    ON matches.tairport = airports.code
    WHERE (airports.code = '?' OR airports.city = '?')

আমার ক্যোয়ারী সঠিক ফলাফলগুলি দেয় এবং এটি হোম ওয়ার্কের উদ্দেশ্যে যথেষ্ট হবে, তবে আমি ভাবছি যে আমি JOINএকাধিক কলামে পারব কিনা ? আমি কীভাবে এই WHEREধারাটি তৈরি করব যাতে এটি প্রস্থান এবং গন্তব্য শহর / কোডের সাথে মিলে যায়?

নীচে আমি কী অর্জন করতে চাই তার উপরে একটি "সিউডো-ক্যোয়ারী" রয়েছে, তবে আমি বাক্য গঠনটি সঠিকভাবে পেতে পারি না এবং কীভাবে airportsপ্রস্থান এবং গন্তব্যগুলির জন্য সারণীটি উপস্থাপন করতে হয় তা আমি জানি না :

SELECT * FROM flights
INNER JOIN airports
ON flights.fairport = airports.code AND flights.tairport = airports.code
WHERE (airports.code = 'departureCode' OR airports.city= 'departureCity') 
    AND (airports.code = 'destinationCode' OR airports.city = 'destinationCity')

হালনাগাদ

এসকিউএল বিবৃতিগুলি কীভাবে তৈরি করা যায় সে সম্পর্কে সাধারণ গাইড হিসাবে খুব সহায়ক হতে এসকিউএল স্টেটমেন্টের এই ভিজ্যুয়াল উপস্থাপনাটিও পেয়েছি !


3
ইঙ্গিত: আপনি প্রতিটি রেকর্ড (Fairport এবং tairport জন্য অপরের জন্য এক জন্য দুটি শহর অনুসন্ধান করতে প্রয়োজন সুতরাং ওকে (প্রকৃতপক্ষে প্রয়োজন) থাকতে হয়। দুই যোগদান করে, বিমানবন্দর টেবিলের সাথে, কিন্তু তাদের একদল অপর Fairport উপর ভিত্তি করে টায়ারপোর্টে
এমজেভি

2
ইঙ্গিত 2: অতএব, আপনাকে বিমানবন্দরগুলির টেবিলটিও উপস্থাপন করতে হবে যাতে আপনি কীভাবে তাদের পার্থক্য করতে জানেন (অর্থাত্ ফেয়ারপোর্ট লুকআপ এবং টায়ারপোর্ট লুকআপ সহ বিমানবন্দর টেবিলটি কী)। ওরফে এসকিউএল কীওয়ার্ডটি হ'ল এএস (এটিকে বাদ দেওয়া যেতে পারে, অর্থাত্ ... বিমানবন্দরগুলি [এএস] এফএ-এফএ কোড = ফ্লাইটস.টায়ারপোর্ট ...)
এমজেভি

উত্তর:


141

নিম্নলিখিত উদাহরণের মতো আপনি যুক্ত টেবিলগুলিকে একটি উপনাম দিয়ে একাধিকবার একই টেবিলের সাথে যোগ দিতে পারেন :

SELECT 
    airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
    flights
INNER JOIN 
    airports from_port ON (from_port.code = flights.fairport)
INNER JOIN
    airports to_port ON (to_port.code = flights.tairport)
WHERE 
    from_port.code = '?' OR to_port.code = '?' OR airports.city='?'

মনে রাখবেন যে, to_portএবং from_portপ্রথম ও দ্বিতীয় কপি জন্য alias লেখা হয় airportsটেবিল।


ঠিক আছে, আমি উপরের সমাধানটি চেষ্টা করেছিলাম এবং নিম্নলিখিত ত্রুটিটি পেয়েছি: আপনার এসকিউএল সিন্টেক্সে আপনার একটি ত্রুটি রয়েছে; 'INNER_JOIN বিমানবন্দরগুলি to_port চালু (to_port.code = ফ্লাইটস.টায়ারপোর্ট) কাছে 7 ম লাইনে কোথায়'
কিরিল

2
ওহ, আমি জানি কেন :) এটি অন্তর্ভুক্ত হওয়ার কথা INNER_JOIN নয় ... ডিওএইচ!
কিরিল

21
যদি বিমানবন্দরগুলির টেবিলটি বিশাল হয় তবে একাধিক শর্তে এটির সাথে একবার যুক্ত হওয়া কি আরও ভাল। এরকম কিছু - flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairportদয়া করে পরামর্শ দিন।
অঙ্কুর-মি

26

কিছুটা এইরকম....

SELECT f.*
      ,a1.city as from
      ,a2.city as to
FROM flights f
INNER JOIN airports a1
ON f.fairport = a1. code
INNER JOIN airports a2
ON f.tairport = a2. code

1
আমি উপরে এটি জিজ্ঞাসা করেছি, চিন্তাও এখানে জিজ্ঞাসা করবে - যদি বিমানবন্দরগুলির টেবিলটি বিশাল হয় (এবং WHERE শর্তটি ব্যবহার করে পুরো ক্যোয়ারীতে আরও ফিল্টার রয়েছে) তবে একাধিক শর্তে একবারে যোগ দেওয়া ভাল। এর মতো কিছু - flights f INNER JOIN airports a ON a.code = f.fairport OR a.code = f.tairportএটি কি কোনও পার্থক্য করে? আপনি কি মনে করেন?
অঙ্কুর-এম

1
এটি ফলাফলগুলিতে একটি পার্থক্য তৈরি করে, প্রাক্তনটি ফ্লাইটে প্রতি সারি তৈরি করে এবং সাথে নিয়ে আসে, আপনার পরামর্শটি প্রতি ফ্লাইটে 2 সারি, এয়ারপোর্টের সাথে একটি সারি এবং একটি এয়ারপোর্টের সাথে তৈরি করে। এটি একবারে যোগ দেওয়া তত দ্রুত হবে।
পল ক্রেসি

19

যদি মাইএসকিএল আপনার জন্য ঠিক থাকে:

SELECT flights.*, 
       fromairports.city as fromCity, 
       toairports.city as toCity
FROM flights
LEFT JOIN (airports as fromairports, airports as toairports)
ON (fromairports.code=flights.fairport AND toairports.code=flights.tairport )
WHERE flights.fairport = '?' OR fromairports.city = '?'

সম্পাদনা: কোড বা শহরের জন্য আউটপুট ফিল্টার করার জন্য উদাহরণ যুক্ত করা


12

আপনি কি কেবল সারণিতে এবং ব্যবহার করতে পারেন?

উদাহরণস্বরূপ, এর মতো কিছু:

SELECT 
   airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
   flights
INNER JOIN 
   airports from_port ON (from_port.code = flights.fairport)
   and (to_port.code = flights.tairport)

4
কীভাবে পৃথিবীতে এটি 14 টি আপগ্রেসে উঠেছে? বিবৃতি সিনট্যাক্স এবং অর্থ উভয়ই ভুল।
আল্ট্রাক্রিয়াপিডিয়ানিয়ান

3

আপনি যদি উভয় এফআরএম এবং টু বিমানবন্দর অনুসন্ধান করতে চান তবে আপনি দুবার বিমানবন্দরের টেবিলে যোগ দিতে চাইবেন - তারপরে আপনি নিজের ফলাফলের সেটে এবং টেবিলে উভয়ই ব্যবহার করতে পারেন:

SELECT
   Flights.*,fromAirports.*,toAirports.*
FROM
   Flights
INNER JOIN 
   Airports fromAirports on Flights.fairport = fromAirports.code
INNER JOIN 
   Airports toAirports on Flights.tairport = toAirports.code
WHERE
 ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.