ورود

View Full Version : حالتی که یه جدول 2 بار به parent وصل شده



shahroq
سه شنبه 17 خرداد 1384, 11:16 صبح
سلام
فرض کنید که یه جدول اطلاعات فردی داریم که 2 تا foriegn key از یه جدول ثوابت داره. یعنی 2 بار به یه جدول متصل شده.
وقتی view میگیرم از این جدول ها مقدار هر 2 تا foriegn key رو مساوی میکنه.
چجوری باید این موضوع رو حل کرد؟

majid_afra222
سه شنبه 17 خرداد 1384, 11:51 صبح
سلام
لطفا ساختار جدول و ویوی نوشته شده رو بفرست تا شاید بتونیم مشکل رو حل کنیم.

shahroq
سه شنبه 17 خرداد 1384, 17:19 عصر
ببین مثلا فرض کن یه جدول ساختی برای اسامی شهرها.
بعد تو جدول مشخصات فرد، هم محل تولد داری، هم محل صدور.
یعنی این جدول 2 بار باید با TBCity ارتباط داشته باشه. چه جوری اینا تو view از هم تفکیک میشن؟
اصلا اینکار(2 تا relation زدن ) کار درستیه؟

karimh
سه شنبه 17 خرداد 1384, 18:03 عصر
سلام
میتونی جدول شهر رو دوبار با جدول افراد تلفیق کنی ...یه بار بر اساس فیلد محل تولد
یه بار براساس فیلد محل صدور

[/img]

AminSobati
جمعه 20 خرداد 1384, 00:42 صبح
دوست عزیزم،
این کار شما کاملا صحیحه و فقط موقع Query گرفتن کافیه دوبار جدول شهرها رو در Query قید کنین:

CREATE TABLE Cities(
CID INT,
CName NVARCHAR(50))

INSERT Cities VALUES(1,'Tehran')
INSERT Cities VALUES(2,'Zanjan')
INSERT Cities VALUES(3,'Hamedan')
INSERT Cities VALUES(4,'Shiraz')
INSERT Cities VALUES(5,'Tabriz')

CREATE TABLE Students(
SID INT,
SName NVARCHAR(50),
Birth_CID INT,
Issue_CID INT)

INSERT Students VALUES(1,'Ali',1,1)
INSERT Students VALUES(2,'Nima',1,2)
INSERT Students VALUES(3,'Hamid',4,5)
INSERT Students VALUES(4,'Reza',2,5)
--------------------------------
SELECT S.SName, C_B.CName, C_I.CName
FROM Students S
JOIN Cities C_B
ON S.Birth_CID=C_B.CID
JOIN Cities C_I
ON S.Issue_CID=C_I.CID

majid_afra222
جمعه 20 خرداد 1384, 00:55 صبح
سلام
پرس و جوی نوشته شده توسط جناب ثباتی عزیز رو می تونی به این صورت هم بنویسی٬‌شاید خواناتر باشه
و یه کمی سریعتر :


SELECT S.SName
, (SELECT C_B.CName FROM Cities C_B WHERE C_B.CID = S.Issue_CID) AS IName
, (SELECT C_I.CName FROM Cities C_I WHERE C_I.CID = S.Birth_CID) AS BName
FROM Students S

AminSobati
جمعه 20 خرداد 1384, 17:05 عصر
مجید جان با خواناتر بودنش موافقم اما در مورد سرعت، شما این دو ایندکس رو بسازین:

CREATE UNIQUE CLUSTERED INDEX IX1 ON Students(SID)
CREATE UNIQUE CLUSTERED INDEX IX1 ON Cities(CID)
حالا Plan اجرا برای هر دو Query رو نگاه کنین. Query شما یک مرحله برای Compute Scalar اضافه کرده که روی تعداد رکوردهای زیاد، میتونه کاملا تاثیرگذار باشه.
به عنوان یک قائده همیشه به یاد داشته باشین، Join از Sub Query میتونه سریعتر عمل کنه!
چون هوش مصنوعی SQL Server یعنی Query Optimizer الگوریتمهای فوق العاده ای روی Join پیاده میکنه، یعنی اساسا منطق Join این امکان رو میده.
موفق باشید

majid_afra222
شنبه 21 خرداد 1384, 08:11 صبح
سلام
ایندکسها رو نداشت............
ممنون