1. مهمان گرامی، جهت ارسال پست، دانلود و سایر امکانات ویژه کاربران عضو، ثبت نام کنید.
    بستن اطلاعیه

Select های تو در تو

شروع موضوع توسط hector2141 ‏26/7/13 در انجمن SQL

  1. کاربر ارشد

    تاریخ عضویت:
    ‏6/9/12
    ارسال ها:
    14,318
    تشکر شده:
    2,702
    امتیاز دستاورد:
    0
    حرفه:
    daneshjo
    Select های تو در تو :
    می توان در درون يک دستور Select ، دستور Select ديگری را تعريف کرد . در اين حالت ابتدا دستور Select درونی اجرا شده و نتايج مورد نظر خود را که سطرهايی از جدول مربوط به آن هستند را استخراج کرده و آنرا به Select بيرونی انتقال می دهد . سپس Select بيرونی نيز اجرا شده و نتايج استخراجی خود را با استفاده از فيلد مشترک بين 2 جدول با سطرهای Select درونی پيوند زده و سطرهای مطابق با شروط تعيين شدهخ را نمايش می دهد .
    از حالت Select های تو در تو برای پيوند جدول ها استفاده می شود و برای زمانی مناسب است که بخواهيم ستون های خروجی در دستور Select فقط از يک جدول که در بيرونی ترين Select تعريف شده اند ، نمايش داده شوند .
    نکته : به تعداد دستورات Select تو در تو ، سطح آن می گويند .
    [HR][/HR] Select های 2 سطحی :
    در اين حالت يک دستور Select در درون دستور Select ديگری تعريف می شود و برای پيوند 2 جدول با استفاده از فيلد مشترک استفاده می شود . نتايج خروجی فقط می تواند شامل سطرهای از جدول Select بيرونی باشد .
    شکل کلی پيوند 2 جدول بااستفاده از Select 2 سطحی به صورت زير است :
    Select نام ستون های مورد نظر برای نمايش از جدول بيرونی
    From نام جدول 1
    Where نام فيلد مشترک 2 جدول IN ( Select نام فيلد مشترک 2 جدول
    From نام جدول 2
    Where شرط ها ... ) ;
    مثال های قسمت های قبل پيوند جدول ها را با استفاده از Select های تو در تو بازنويسی می کنيم .
    مثال : نام و نام خانوادگی دانشجويانی را ارائه دهيد که در ترم 1 سال تحصيلی 85 - 86 ، درس با کد 1012 را انتخاب کرده اند :
    [TABLE="class: ex"]
    [TR]
    [TD="class: header, colspan: 2"] مثال [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Select Name , Family
    From Students
    Where Student ID IN ( Select Student ID
    From Selection
    Where Course ID = 1012 AND Term = 1 AND Year = ' 85 - 86 ' ) ; [/TD]
    [TD="class: header"] کد[/TD]
    [/TR]
    [TR]
    [TD="class: body"] [TABLE="class: ex"]
    [TR]
    [TD="class: header"] Name[/TD]
    [TD="class: header"] Family[/TD]
    [/TR]
    [TR]
    [TD="class: body"] Ehsan[/TD]
    [TD="class: body"] Amiri[/TD]
    [/TR]
    [TR]
    [TD="class: body"] Ahmad[/TD]
    [TD="class: body"] Rezaee[/TD]
    [/TR]
    [/TABLE]
    [/TD]
    [TD="class: header"] خروجی [/TD]
    [/TR]
    [/TABLE]
    نکته : تفاوت اين حالت با مثال های قبلی در اين است که ستون های نمايش داده شده فقط از يک جدول ( جدول Select بيرونی ) نمايش داده می شوند .
    مثال : نام دروسی را ارائه دهيد که دانشجو با شماره دانشجويي 10254861 انتخاب کرده است :
    [TABLE="class: ex"]
    [TR]
    [TD="class: header, colspan: 2"] مثال [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Select Coures ID , CoTitle
    From Courses
    Where Course ID IN ( Select Course ID
    From Selection
    Where Student ID = 10254861 ) ; [/TD]
    [TD="class: header"] کد[/TD]
    [/TR]
    [TR]
    [TD="class: body"] [TABLE="class: ex"]
    [TR]
    [TD="class: header"] Course ID [/TD]
    [TD="class: header"] Course Title [/TD]
    [/TR]
    [TR]
    [TD="class: body"] 1011 [/TD]
    [TD="class: body"] پايگاه داده [/TD]
    [/TR]
    [TR]
    [TD="class: body"] 1013 [/TD]
    [TD="class: body"] زبان تخصصی [/TD]
    [/TR]
    [/TABLE]
    [/TD]
    [TD="class: header"] خروجی[/TD]
    [/TR]
    [/TABLE]

    [HR][/HR] Select های 3 سطحی :
    در اين حالت 3 دستور Select به صورت تو در تو تعريف شده اند و برای پيوند 3 جدول به صورت 2 به 2 و با استفاده از فيلد های مشترک استفاده می شود . نتايج خروجی فقط می تواند شامل ستون هايي از بيرونی ترين Select تعريف شده باشد . در اين حالت از جدول دوم برای پيوند جدول های 1 و 3 استفاده می شود .
    شکل کلی پيوند 3 جدول با استفاده از Select های 3 سطحی به صورت زير است :
    Select نام ستون های مورد نظر جهت نمايش از جدول 1
    From نام جدول 1
    where نام فيلد مشترک جدول 1 و 2 IN ( Select نام فيلد مشترک جدول 1 و2
    From نام جدول 2
    Where نام فيلد مشترک جدول 2 و 3 IN ( Select نام فيلد مشترک جدول 2 و 3
    From نام جدول 3
    Where بقيه شرط ها ... )) ;
    مثال : نام و نام خانوادگی دانشجويانی را ارائه دهيد که حداقل يک درس از نوع نظری را انتخاب کرده باشد :
    [TABLE="class: ex"]
    [TR]
    [TD="class: header, colspan: 2"] مثال [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Select Name , Family
    From Students
    where Student ID IN ( Select Student ID
    From Selection
    Where Course ID IN ( Select Course ID
    From Courses
    Where CoType = ' نظری ' )) ; [/TD]
    [TD="class: header"] کد[/TD]
    [/TR]
    [TR]
    [TD="class: body"] [TABLE="class: ex"]
    [TR]
    [TD="class: header"] Name [/TD]
    [TD="class: header"] Family [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Zahra [/TD]
    [TD="class: body"] Hosini [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Sahar [/TD]
    [TD="class: body"] Ahamadi [/TD]
    [/TR]
    [TR]
    [TD="class: body"] Hesam [/TD]
    [TD="class: body"] Razavi [/TD]
    [/TR]
    [/TABLE]
    [/TD]
    [TD="class: header"] خروجی[/TD]
    [/TR]
    [/TABLE]