2013-06-10 5 views
6

Here मैंने प्रश्न पूछने के बारे में प्रश्न पूछा।मूल्य> = सभी (v2 का चयन करें ...) मूल्य से अलग-अलग परिणाम उत्पन्न करता है (अधिकतम चयन करें (v2) ...)

आकस्मिक रूप से (एक उत्तर की मदद से) मैंने पाया कि समाधान को सही तरीके से कैसे बनाया जाए। समस्या यह है कि मुझे समझ में नहीं आता कि वे अलग-अलग परिणाम क्यों देते हैं।

तो, डेटाबेस इस स्कीमा है:

enter image description here

और मैं उच्चतम मूल्य के साथ PC, Printer और Laptop से सभी मॉडलों के लिए खोज कर रहा हूँ। इन सभी तालिकाओं में गैर-अद्वितीय model कॉलम हो सकता है, क्योंकि विभिन्न code वाले आइटम समान मॉडल हो सकते हैं।

मेरे मूल समाधान था:

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price >= all(select price from model_price) 

यह गलत परिणाम दे दी है - प्रणाली * Wrong number of records (less by 2) लौट आए।

with model_price(model,price) as (
select model,price 
from PC 

union 

select model,price 
from Laptop 

union 

select model,price 
from Printer 
) 

select model 
from model_price 
where price = (select max(price) from model_price) 

तो, क्यों all साथ समाधान अलग परिणाम पैदा करता है:

को सही समाधान जो काम करता है है?


एसक्यूएल इंजन के बारे में: Now we use Microsoft SQL Server 2012 on the rating stages, and MySQL 5.5.11, PostgreSQL 9.0, and Oracle Database 11g on the learn stage in addition. तो मैं जो इंजन वास्तव में वे इस अभ्यास गधे करने के लिए उपयोग पता नहीं है।

+1

डेटा में कोई भी 'एनयूएलएल'? '1 चुनें जहां 1> = सभी (नल यूनियन का चयन करें 0 का चयन करें)' कोई पंक्ति नहीं देता है। –

+0

क्षमा करें, मुझे दूसरे डेटाबेस के लिए डेटा नहीं पता है (यह जानबूझकर उन लोगों के लिए बनाया गया है जो व्यायाम नहीं करते हैं)। मैं दूसरे डीबी पर प्रश्नों के परिणाम भी नहीं देख सकता, केवल गलत क्या है, उदाहरण के लिए। '* रिकॉर्ड्स की गलत संख्या (2 से कम)'। – ovgolovin

उत्तर

5
create table t (f int null); 

select 1 where 1 >= (select max(f) from t); -- 1 
select 1 where 1 >= all(select f from t); -- 2 

insert into t values (null), (0); 

select 1 where 1 >= (select max(f) from t); -- 3 
select 1 where 1 >= all(select f from t); -- 4 

http://www.sqlfiddle.com/#!6/3d1b1/1

पहले select रिटर्न कुछ भी नहीं, दूसरे select रिटर्न 1

MAX एक स्केलर मान देता है। यदि कोई पंक्ति मौजूद नहीं है, तो MAXNULL देता है। 1 >= NULL लाइन 1 पर सच नहीं है। दूसरी तरफ, 1 >= all f एस सच है, क्योंकि f एस कोई भी नहीं है जिसके लिए स्थिति सत्य नहीं है।

तीसरा select1 देता है, चौथा select कुछ भी नहीं देता है।

MAX, सभी समेकित कार्यों की तरह, NULL एस को अनदेखा करता है। MAX(f) लाइन 3 पर 0 है, और 1 >= 0 सत्य है। ALL नहीं करता है: यह लाइन 4 पर 1 >= NULL AND 1 >= 0 का मूल्यांकन करता है, जो सत्य नहीं है।

+0

ध्यान दें कि यदि आप किसी अन्य कारण से 'ALL' का उपयोग करना चाहते हैं तो आप 'ISNULL' (उर्फ' ISNULL (मूल्य, 0) ') का उपयोग कर सकते हैं। – Guvante

+0

धन्यवाद!शायद यह अभ्यास मुझे इस कार्य से सीखना चाहिए! इसलिए, तुलना किए जाने पर 'NULL' को स्वचालित रूप से' 0' तक प्रचारित नहीं किया जाता है। – ovgolovin

+0

दाएं, और यदि सभी फ़ील्ड मानों के नकारात्मक होने के लिए यह संभव है, तो 'NULL' के रूप में' 0' के रूप में व्यवहार करना भी गलत हो सकता है, इसलिए शायद यह एक अच्छी बात है कि डेटाबेस स्वचालित रूप से ऐसा नहीं करता है। यदि आपके पास विशेष "छूट" लेख हैं, तो यह फ़ील्ड "कीमत" के लिए भी समझ में आ सकता है। – hvd

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