PDA

View Full Version : select تو در تو select * from table name where shart in (select * from tablename where shart)



mina.net
شنبه 10 مرداد 1388, 01:49 صبح
سلام دوستانمن می خوام از یک select تو در تو استفاده کنم از یک کتاب دیدم ولی هر چی سعی کردم نشد. با وجودی که به همه مطالب کتاب با دقت عمل کردم.دوستانی که به این روش آشنایی دارند لطفا کمک کنن.در ضمن در موارد پیشرفته تر اون هم توضیحاتی بفرمایید . مثلا موقعی که ار select تو در تو استفاده می کنیم order by و یا group by و یا having چطور استفاده می شود با توجه به اینکه از چند select استفاده می کنیم.

mn_zandy63
شنبه 10 مرداد 1388, 03:19 صبح
سلام٬ مشکلت کجاست؟
کار خاصی نباید انجام بدی٬ میتونی به عنوان مثال دور Select داخلی یک پرانتز بذاری٬ یا آخرش بنویسی AS TableName که یک اسم جدید بهش بدی٬ از این به بعد میتونی با این اسم روی Select داخلی query بزنی برای order by و یا group by هم به همین شکل.
مثلا


SELECT tbl.fld2, tbl.fld1 from
(SELECT f1as fld1, f2 as fld2
FROM t) AS tbl
ORDER BY tbl.fld2


سلام دوستانمن می خوام از یک select تو در تو استفاده کنم از یک کتاب دیدم ولی هر چی سعی کردم نشد. با وجودی که به همه مطالب کتاب با دقت عمل کردم.دوستانی که به این روش آشنایی دارند لطفا کمک کنن.در ضمن در موارد پیشرفته تر اون هم توضیحاتی بفرمایید . مثلا موقعی که ار select تو در تو استفاده می کنیم order by و یا group by و یا having چطور استفاده می شود با توجه به اینکه از چند select استفاده می کنیم.

davoodrm666_666
شنبه 10 مرداد 1388, 16:30 عصر
فرض کن
جدول Funcontract
1- serial
2-contractno
و جدول FunCash
1- serial
2- contractref
3-Amount
4- Type
موجود است و مثال 1 بااستفاده از یک Drive Table و مثال 2 هم دقیقا خروجی مشابه مثال 1 رو داره


مثال 1

Select Funcontract.Serial , D.Amount
From Funcontract
Inner Join (
Select contractref, Sum(Amount) as Amount
From FunCash
Where Type = 1
Group By contractref
) D on Funcontract.Serial = D.Contractref
مثال 2

Select Funcontract.Serial, Sum(FUNCash.Amount) as Amount
From Funcontract
Inner Join FunCash On Funcontract.Serial = Funcash.Contractref
Where FunCash.Type = 1
Group By FunContract.serial

mn_zandy63
شنبه 10 مرداد 1388, 16:41 عصر
نوعی select رو توی عنوان سوالت گذاشتی که دفعه اول ندیدم.

select * from table name where shart in (select * from tablename where shart)
در این حالت هم نباید مشکلی باشه٬ بگو مشکلت چیه. query ت رو بذار تا ببینیم.
فقط یک نکته٬ توی select اول نوشتی شرط٬ اما اینجا شرط نیست٬ در این حالتی که نوشتی باید مثلا اسم یک ستون رو بنویسی (البته محدود به این هم نیستی):

select * from table name where column_name in (select * from tablename where shart)

کل قسمتی که از اسم ستون تا پایان select داخلی هست شرط select اولته. و هیچ ارتباط دیگه ای با SELECT اولت نداره. بنابراین وقتی در select اولی٬ order یا group by میکنی select دوم هیچ تاثیری نداره و به ستونهاش دسترسی نداری.

mina.net
شنبه 10 مرداد 1388, 23:52 عصر
من مشکل خاصی ندارم الان فقط می خوام یاد بگیرم تا در فیلتر کردن های پیشرفته تر برای گزارشات از این روش هم در موارد لزوم استفاده کنم. لطفا توضیح بفرمایید فرمت اصلی این کدچی هست و در حالت های مختلف (مثل ...,sum,join , group by , order by) چطور باید استفاده بشه.



select * from table name where column_name in (select * from tablename where shart)

خوب حالا نتیجه دستور بالا با دستور زیر چه فرقی می کنه


select * from tablename where shart


منظورم اینه که where اول بی تاثیر خواهد بود اینطور نیست؟

afrooz_rahmati63@yahoo.com
یک شنبه 11 مرداد 1388, 00:23 صبح
select * from table name where column_name in (select * from tablename where shart


نمی تونید در selection مربوطه از * استفاده کنید حتما نتیجه باید یک ستون را برگرداند.بنابراین :


select * from table name where column_name in (select Col1 from tablename where ...whatever...


تفاوت در اين است كه گاهی اوقات شما نياز دارین از مقادیری استفاده کنید که از یک جدول دیگر یا حتی همان جدول جاری بدست آمده ، به عنوان مثال فرض کنید Query داخلی نتیجه 12،13،22،93...را برگرداند سپس شما با اجرای یک Query تمام نتايج ستون هايي را كه مقادیرشان 12،13،22،93 است را برمي گردانید.
البته گاهی اوقات select تو در تو را خيلي راحت مي توني با يك join ساده بنویسی پس توی استفاده اون دقت کن. سعي كن هميشه با ساده ترین و در عین حال بهینه به نتیجه برسی.اگر در جایی نیاز به استفاده از select تو در تو داری اون مثال را بگو تا بتونی ملموس تر دلیل استفاده از select را بفهمي

mn_zandy63
یک شنبه 11 مرداد 1388, 01:07 صبح
نمی تونید در selection مربوطه از * استفاده کنید حتما نتیجه باید یک ستون را برگرداند.بنابراین :


select * from table name where column_name in (select Col1 from tablename where ...whatever...




حق با دوستمونه٬ من به این قسمتش دقت نکردم.


خوب حالا نتیجه دستور بالا با دستور زیر چه فرقی می کنه
کد:
select * from tablename where shart
منظورم اینه که where اول بی تاثیر خواهد بود اینطور نیست؟
خب اون تیکه select دوم هم در واقع یک شرطه دیگه. به توضیحات afrooz_rahmati63@yahoo.com دقت کن

mina.net
یک شنبه 11 مرداد 1388, 10:07 صبح
سلام دوستان


اگر در جایی نیاز به استفاده از select تو در تو داری اون مثال را بگو تا بتونی ملموس تر دلیل استفاده از select را بفهمي

مثلا وقتی که از شرطهای زیادی برای select استفاده می کنیم مخصوصا وقتی از دو عملگر and , or همزمان استفاده می کنیم معمولا بین and, or تداخل ایجاد می شود و بازم معمولا عملگر or اثر شرطیهای دیگر را خنثی می کند. خوب اگرما بتونیم از select تو در تو استفاده کنیم می تونیم در یکی همه شروطی که با عملگر or هستند و در دیگری همه شروطی که با and همراه هستند را به کار بریم.
من دوتا جدول تو برنامه ام دارم می زارم و سعی می کنم براساس اون سوال کنم فکر کنم اینطور بهتر حرف هم رو می فهمیم.
جدول اول hesab
1- id=برابر با id_hesabدر جدول bed_best
2-name=نام
3-city=شهر
4-masir=مسیر

جدول دوم bed_best
1- id_hesab= برابر با id در جدول بالا
2- bed= مبلغ بدهکاری
3- best= مبلغ بستانکار

فرض کنید می خواهیم یک گزارش پویا درست کنیم و به کار بر اجازه بدیم براساس احتیاجی که دارد گزارش مورد نظرش رو بدست بیاره.
نکته : توجه داشته باشید که ما نمی تونیم یک select بنویسیم و تمام ، بلکه ممکنه با انتخابهای که به کاربر می دیم ترکیبات مختلفی از یک گزارش رو به دست بیاریم.

خوب من در ادامه جدول دیگری را هم در این قسمت قرار می دهم تا بتونیم select های پیچیده تری رو هم بررسی کنیم.
بزودی بر می گردم.

mina.net
سه شنبه 13 مرداد 1388, 13:52 عصر
سلام دوستان
فرض کنید با توجه به دو جدولی در بالا قرار دادم می خواهیم "همه افراد بدهکار یا کسانی که مانده حسابشان 0 هست که از تهران هستند و از مسیر مثلا انقلاب هستند" رو پیدا کنیم . البته با یک select هم می شه ولی می خوام از select تو در تو استفاده بشه.

mina.net
چهارشنبه 14 مرداد 1388, 15:05 عصر
نمی تونید در selection مربوطه از * استفاده کنید حتما نتیجه باید یک ستون را برگرداند.بنابراین :


select * from table name where column_name in (select Col1 from tablename where ...whatever...


تفاوت در اين است كه گاهی اوقات شما نياز دارین از مقادیری استفاده کنید که از یک جدول دیگر یا حتی همان جدول جاری بدست آمده ، به عنوان مثال فرض کنید Query داخلی نتیجه 12،13،22،93...را برگرداند سپس شما با اجرای یک Query تمام نتايج ستون هايي را كه مقادیرشان 12،13،22،93 است را برمي گردانید.
البته گاهی اوقات select تو در تو را خيلي راحت مي توني با يك join ساده بنویسی پس توی استفاده اون دقت کن. سعي كن هميشه با ساده ترین و در عین حال بهینه به نتیجه برسی.اگر در جایی نیاز به استفاده از select تو در تو داری اون مثال را بگو تا بتونی ملموس تر دلیل استفاده از select را بفهمي

سلام دوستان
منظور از where column_name چیه ؟
آیا نام فیلدها را بنویسیم یا شرط ؟
من از کد زیر استفاده کردم ولی برای in خطای sintax می ده.


select * from big_factor where city=N'آمل' in (select * from big_factor where type_f_kh=N'برگشت از خرید' or type_f_kh=N'فروش' )

davoodrm666_666
چهارشنبه 14 مرداد 1388, 17:20 عصر
وقتی از دستور این استفاده می کنی نمی تونی از * استفاده کنی روش درستش بصورت زیر است


select * from
big_factor
where city=N'آمل'
And serial in (
select serial
from big_factor
where type_f_kh=N'برگشت از خرید' or type_f_kh=N'فروش'
)

البته به طور کلی این نوع Condition نوشتن اشتباهه مثلا برای چک کردن شهر شما باید یک جدول شهر داشته باشید و در جدول big_factor بجای نگه داشتن نام شهر از ref شهر که از جدول شهر هاتون است استفاده کنید

mina.net
چهارشنبه 14 مرداد 1388, 22:47 عصر
البته به طور کلی این نوع Condition نوشتن اشتباهه مثلا برای چک کردن شهر شما باید یک جدول شهر داشته باشید و در جدول big_factor بجای نگه داشتن نام شهر از ref شهر که از جدول شهر هاتون است استفاده کنید

من برای نگهداری شهر ، مسیر و آدرس از جدول دیگری استفاده می کنم ولی برای اینکه بهتر حرف هم رو بفهمیم اینجا از یک جدول استفاده کردم.
یک سوال آیا در select تو در تو فقط می توان نتیجه یک فیلد رو برگردوند؟ چون وقتی از فیلدهای بیشتری جهت select استفاده می کنم خطا می ده و می گه نباید بیشتر از یک فیلد باشه.
برای حل این مشکل باید چیکار کرد؟
یک سوال کلی تر
برای اینکه عملگرهای and و or در نتیچه فیلتر با هم تداخل پیدا نکنن باید چیکار کرد؟

mn_zandy63
پنج شنبه 15 مرداد 1388, 02:11 صبح
برای اینکه عملگرهای and و or در نتیچه فیلتر با هم تداخل پیدا نکنن باید چیکار کرد؟

جای دیگه ای فکر میکنم در این مورد جواب داده شد٬ کافیه از پرانتز ها استفاده کنی.
بحثی که میکنی٬ همون بحث تقدم عملگراست دیگه.

hobab-theme
چهارشنبه 21 مرداد 1388, 16:48 عصر
سلام دوستان
راستش من اولین باریه که میخوام از سلکت تو در تو استفاده کنم . البته با سلکت معمولی زیاد کار کردم
من میخوام از روش زیر پیش برم ولی همون طوری که خانم mina.net گفتن ارور syntaxt میده


<script runat="server">
Sub Page_Load()
If Not Page.IsPostBack Then
Dim con As New SqlConnection(ConfigurationManager.ConnectionStrin gs
("Database").ConnectionString)
Dim str As String
str = "SELECT * FROM Customers ORDER BY NO DESC WHERE Username IN(SELECT Username FROM
MembersAccount WHERE Username = @username AND RegKey = @regKey"
Dim cmdSelectFactors As New SqlCommand(str, con)
cmdSelectFactors.Parameters.AddWithValue("@username", Request.Cookies
("Members").Values.Item("Username"))
cmdSelectFactors.Parameters.AddWithValue("@regKey", Request.Cookies
("Members").Values.Item("RegKey"))
Using con
con.Open()
cmdSelectFactors.ExecuteScalar()
GridView_ViewFactors.DataSource = cmdSelectFactors
GridView_ViewFactors.DataBind()
End Using
End If
End Sub
</script>

به نظر شما مشکلش کجاست:متفکر:

mn_zandy63
پنج شنبه 29 مرداد 1388, 20:58 عصر
سلام دوستان
راستش من اولین باریه که میخوام از سلکت تو در تو استفاده کنم . البته با سلکت معمولی زیاد کار کردم
من میخوام از روش زیر پیش برم ولی همون طوری که خانم mina.net گفتن ارور syntaxt میده

چه خطایی؟ متن خطا رو بنویس.
یه پرانتز هم احتمالا باید آخر دستور Select ت باشه٬ اون رو هم بزار.