PDA

View Full Version : معادل شرط OR در کوئری



abolfathi
دوشنبه 19 اردیبهشت 1390, 14:46 عصر
SELECT name FROM students WHERE age > 25 AND grade > C

کوئری بالا رو میشه به کمک select های تودرتو به شکل زیر نوشت :

select name from (select * from students where grade > C) as std1 where age > 25

آیا میشه همچین کاری رو هم برای شرط OR انجام داد ؟ یعنی مثلا به جای

SELECT name FROM students WHERE age > 25 OR grade > C

یک کوئری نوشت که فقط از دستور SELECT استفاده کرده باشه ؟
یعنی مثلا یه همچین چیزی رو تنها با SELECT نوشت :

a or b = not( not(a) and not(b) )

Reza_Yarahmadi
دوشنبه 19 اردیبهشت 1390, 19:25 عصر
برای OR نمیشه بصورت Select تودرتو نوشت. میشه بصورت زیر اونو نوشت ولی استفاده از OR از نظر زمانی مناسبتره.
SELECT name FROM students WHERE age > 25
UNION
SELECT name FROM students WHERE grade > C

Mishtolak
سه شنبه 20 اردیبهشت 1390, 15:41 عصر
با سلام
آيا در مورد مثال And استفاده از select تودرو مناسب تره؟

محمد سلیم آبادی
سه شنبه 20 اردیبهشت 1390, 19:55 عصر
ببین این همونی هست که میخواهین:

SELECT name
FROM (
SELECT name, CASE WHEN age > 25 THEN 1 ELSE 0 END AS b
FROM Students
) AS D
WHERE D.b = 1
OR grade > 1;

البته فکر میکنم بازم اونی نیست که دنبالش هستین.
یا این یکی:

SELECT name
FROM (
SELECT name, CASE WHEN age > 25 THEN 1 ELSE 0 END AS b
FROM Students
) AS D
WHERE COALESCE(CASE WEHN grade > c THEN 1 END, D.b, 0) = 1;

محمد سلیم آبادی
سه شنبه 20 اردیبهشت 1390, 20:52 عصر
این فرمول یعنی:

a or b = not( not(a) and not(b) )


باید جواب بده. و کد اسکیول اون هم به شکل زیر هست. ولی سوالم اینه که چرا قصد دارین مساله رو اینقدر پیچیده تر کنید؟!

CREATE TABLE #Students
(name integer not null primary key,
age int not null,
grade int not null);

insert into #Students
values (1,26,0), (2,20,2), (3, 26, 1),
(4,20,0);

SELECT name
FROM #Students AS S1
WHERE NOT EXISTS
(SELECT *
FROM #Students AS S2
WHERE S1.name = S2.name
AND NOT EXISTS
(SELECT *
FROM #Students AS S3
WHERE grade > 1
AND S2.name = S3.name)
AND NOT EXISTS
(SELECT *
FROM #Students AS S4
WHERE age > 25
AND S4.name = s2.name));

SELECT name
FROM #Students
WHERE age > 25
OR grade > 1;

DROP TAbLE #Students

abolfathi
شنبه 24 اردیبهشت 1390, 02:01 صبح
مرسی
واقعا عالی بود
حالا فکرشو بکنید که به جای AND ها هم باید از همون select های تودرتو استفاده بشه. چی میشه.
البته باید فقط از select استفاده می شد. یعنی بدون NOT EXISTS یا UNION هم میشه ؟

محمد سلیم آبادی
شنبه 24 اردیبهشت 1390, 21:36 عصر
یعنی بدون NOT EXISTS یا UNION هم میشه ؟
از لحاظ منطقی NOT EXISTS با COUNT = 0 یکی هست. یعنی تعداد سطرها برابر با صفر باشه به معنای empty set.
منظورتو از اینکه فقط از select استفاده بشه نمی فهمم. در ماده where باید یک عبارت boolean باشه. یک select خالی که امکان پذیر نیست.

abolfathi
یک شنبه 25 اردیبهشت 1390, 23:30 عصر
یعنی مثل اون کوئری معادل AND تو پست اول که فقط SELECT داره و غیر از SELECT از هیچ چیز دیگه ای استفاده نشده. نه UNION و نه NOT EXISTS و نه چیز دیگه

Reza_Yarahmadi
دوشنبه 26 اردیبهشت 1390, 17:29 عصر
یعنی مثل اون کوئری معادل AND تو پست اول که فقط SELECT داره و غیر از SELECT از هیچ چیز دیگه ای استفاده نشده. نه UNION و نه NOT EXISTS و نه چیز دیگه
برای OR نمیشه همچین کاری کرد. اینم در نظر بگیرید حتی هر 2 روش (استفاده از UNION و NOT EXISTS) از نظر زمانی و حافظه سربار بیشتری نسبت به استفاده از OR دارند.