PDA

View Full Version : دستور SQL برای جستجو در جداول مرتبط



FatemehB
دوشنبه 30 شهریور 1383, 07:48 صبح
سلام دوستان

من به دستور SQL ای نیاز دارم که بتواند با استفاده از Relation های جداول جستجو را

انجام دهد . :roll:

مثلا فرض کنید دو جدول به صورت زیر داریم :

مسافر سفر
---------- ---------
کد مسافر کد سفر
نام مسافر کد مسافر

حالا به دستور SQL ای نیاز دارم که :

نام مسافر گرفته شود و مشخص کند که این مسافر چه سفری داشته است

:) از توجهتان ممنون .

AminSobati
دوشنبه 30 شهریور 1383, 11:50 صبح
دوست عزیزم،
فرض کنید جداول شما به این صورت باشه (چند رکورد نمونه هم وارد میکنیم):


CREATE TABLE Mosafer (
MosaferID INT,
MosaferName NVARCHAR(80))
GO
INSERT Mosafer VALUES(1,'Ali')
INSERT Mosafer VALUES(2,'Nima')
GO
CREATE TABLE Safar(
SafarID INT,
MosaferID INT,
SafarDate DATETIME,
Maghsad NVARCHAR(50))
GO
INSERT Safar VALUES(1,1,'2004/2/25','Shiraz')
INSERT Safar VALUES(2,1,'2004/4/21','Mashad')
INSERT Safar VALUES(3,2,'2003/5/5','Esfehan')
INSERT Safar VALUES(4,2,'2002/2/5','Tabriz')
INSERT Safar VALUES(5,2,'2004/11/6','Zanjan')
GO

در اینجا ما فقط 2 مسافر معرفی کردیم که هر کدام تعدادی سفر داشتن. برای اینکه بدست بیاریم یک مسافر خاص، چه سفرهایی داشته، یک INNER JOIN ساده انجام میدیم:

DECLARE @MID INT
SET @MID = 1

SELECT Mosafer.MosaferName, Safar.SafarDate, Safar.Maghsad FROM
Mosafer INNER JOIN Safar ON Mosafer.MosaferID=Safar.MosaferID
WHERE Safar.MosaferID=@MID
در اینجا فرض کردیم مسافرتهای مسافری با کد 1 مد نظر بوده. مثلا این دستور رو با مقدار 2 میتونین اجرا کنین یا هر کدی که مربوط به یک مسافر باشه.

موفق باشید،
امین ثباتی MCSD

FatemehB
پنج شنبه 02 مهر 1383, 07:46 صبح
دوست عزیز

از اینکه به سوالم توجه کرده و با حوصله و دقت زیادی جواب مرا دادید بسیار متشکر و ممنونم .

ولی من در VB6 نتوانستم باز از دستور SQL ای که توضیح داده اید استفاده کنم . :?:

آیا استفاده @ برای فیلدهای کلید لازم است ؟ :|

AminSobati
پنج شنبه 02 مهر 1383, 15:29 عصر
دقیقا کدام دستور SQL به اشکال خورد؟ ضمنا @ به فیلد کلیدی ارتباطی نداره و صرفا برای تعریف متغیر استفاده کردم.
شاید مشکل شما در نحوه کد نویسی بوده. به چه صورت از VB دستور SELECT رو به SQL Server ارسال کردین؟

FatemehB
جمعه 03 مهر 1383, 08:15 صبح
سلام :)


strsql = "SELECT Passengerr.Name, Passenger_Tour.Waggon_Number , Passenger_Tour.Seat_Number FROM Passenger INNER JOIN Passenger_Tour ON Passenger.PassengerID = Passenger_Tour.PassengerID WHERE Passenger_Tour.PassengerID = @1"

حالا به جای 1 کد مسافر را می گذارم . :?
باز کردن پایگاه داده هم به صورت زیر است :



objCnn.CursorLocation = adUseClient
objCnn.Open Provider & ";" & DataSource
objCmd.ActiveConnection = objCnn
objCmd.CommandType = adCmdText
objCmd.CommandText = strsql
Set objRst = objCmd.Execute(strsql)

باز هم از کمکتان ممنون . :flower: :flower:

AminSobati
جمعه 03 مهر 1383, 12:54 عصر
دوست عزیزم،
وقتی شما از SQL Server استفاده میکنید، ارسال Query به طور مستقیم کار مناسبی نیست. باید Query رو در یک Stored Procedure قرار بدین تا SQL Server اون رو Cache کنه و براش Execution Plan بدست بیاره تا سرعت اجراش افزایش پیدا کنه. مثلا چیزی شبیه به این:


CREATE PROC MyQuery
@PID INT AS

SELECT Passengerr.Name, Passenger_Tour.Waggon_Number ,
Passenger_Tour.Seat_Number FROM Passenger INNER JOIN Passenger_Tour ON
Passenger.PassengerID = Passenger_Tour.PassengerID WHERE
Passenger_Tour.PassengerID = @PID

حالا از VB، اون رو Call میکنیم:


Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As ADODB.Recordset
Dim PassengerID As Integer

Private Sub Form_Load()
PassengerID = 1
cnn.ConnectionString = "تنظیمات مورد نیاز"
cnn.CursorLocation = adUseClient
cnn.Open

Set cmd.ActiveConnection = cnn
cmd.CommandText = "MyQuery"
cmd.CommandType = adCmdStoredProc

cmd.Parameters.Append cmd.CreateParameter _
("P1", adInteger, adParamInput, , PassengerID)

Set rst = cmd.Execute
Set DataGrid1.DataSource = rst
End Sub

که در PassengerID = 1 هر مقداری که به جای 1 نیاز دارید قرار میدین. ضمنا من یک DataGrid روی فرم قرار دادم تا نتیجه دیده بشه.

FatemehB
شنبه 04 مهر 1383, 08:05 صبح
ممنون از توجهتان ، :flower: :flower: :flower:

میرم امتحان کنم . :) :)

AminSobati
شنبه 04 مهر 1383, 11:17 صبح
موفق باشید