2009-08-21 21 views
11

मेरे पास एक टीम टेबल और एक खिलाड़ी टेबल है और मैं उन सभी टीमों को ढूंढना चाहता हूं जिनके पास उनके साथ जुड़े खिलाड़ी नहीं हैं। खिलाड़ियों की तालिका team_id कॉलम के माध्यम से जुड़ी हुई है। मैं इसके लिए रेल पर रूबी का उपयोग कर रहा हूं इसलिए मेरे पास एक टीम और प्लेयर मॉडल है।संबंधित लोगों के बिना सभी रिकॉर्ड ढूंढना

+0

एसक्यूएल में से कौन सा बोली आप उपयोग कर रहे हैं? –

+0

आदर्श रूप से यह MySQL, Postgres और Sqlite3 –

उत्तर

15

यह बेहतर एक बाएं कर प्रदर्शन कर सकते हैं में शामिल होने:

SELECT 
teams.* 
FROM teams 
LEFT JOIN players ON (teams.id = players.team_id) 
WHERE 
players.team_id IS NULL 

या इसका उपयोग करते अरेल (JasonKing की टिप्पणी के लिए धन्यवाद):

Team.includes(:players).where('players.team_id IS NULL') 
+0

परफेक्ट हैं, तो मैं थोड़ी देर ले रहा हूं, और मैं रेल का भी उपयोग कर रहा हूं (मुझे कुछ उल्लेख करना चाहिए था, मुझे लगता है) तो यह अच्छी तरह से संबंध में है: जुड़ता है और: शर्तें वाक्यविन्यास। –

+3

शामिल होने के लिए एसक्यूएल का उपयोग करने की कोई आवश्यकता नहीं है, यही वह है जो '() 'करता है। अर्थात। 'Team.includes (: खिलाड़ियों)। कहीं ('players.team_id IS NULL')' – smathy

+3

एक आखिरी ताकत: 'team.includes (: players)। कहीं (: खिलाड़ी => {: team_id => nil})' – smathy

4

कुछ इस तरह:

select * from teams 
where id not in (select distinct team_id from players) 
+0

के साथ काम करना चाहिए इस दृष्टिकोण के साथ नकारात्मकता: यदि आपके पास बहुत सारे खिलाड़ी –

0

आप करना चाहते हैं कि एक NOT EXISTS हालत इतनी तरह के साथ:

SELECT * 
FROM teams 
WHERE NOT EXISTS (SELECT 1 FROM players WHERE players.team_id = teams.team_id) 
1

आप आम तौर पर एक बाहरी ऐसा करने में सक्षम होना चाहिए बच्चे और जांच करने के लिए माता पिता से शामिल होने के बच्चे के उस क्षेत्र में एक शून्य मूल्य के लिए जो शून्य-सक्षम नहीं है। यह आमतौर पर 'इन नहीं' या 'अस्तित्व में नहीं' से तेज़ होता है। यह सभी डेटाबेस पर काम नहीं कर सकता है।

संबंधित मुद्दे