PDA

View Full Version : join



phantasm
یک شنبه 28 فروردین 1384, 12:18 عصر
ما دارای دو جدول هستیم که میخواهیم از الحاق آن ها به هم یک دیدگاه بگیریم , ولی در گرفتن این دیدگها دچار دو مشکل شدیم .
اول اینکه زمانی که اینها را با هم الحاق می کنیم به علت اینکه ما در هردو جدولمان دارای یک ستون با نام c_name هستیم در جدول حاصل ما نیز دو ستون c_name می آید که زمانی که می خواهیم دیدگاهمان را ذخیره کنیم پیغام خطا می دهد و می گوید که دارای دو ستون هم نام هستی !
دوم اینکه view ما نباید فقط در مورد دو جدول خاص کار کند بلکه با منتقل کردن آن به یکstored procedure قصد داریم تا آن را برای همه جداول و همه db ها به کار ببریم . منظور از به کار بردن این جمله این بود که در جلوی select حتما باید * بیاید من دستوری که در create view نوشتم را در پایین نوشتم تا شما اشکال کار من را پیدا کنید .
select
from dbo.borrow INNER JOIN dbo.customer
ON dbo.borrow.c_name=dbo.customer.c_name
من ساختار db خودم را هم در پایین ضمیمه کردم .


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Create_temp_table]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Create_temp_table]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Drop_temp_table]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[Drop_temp_table]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getviewlist]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[getviewlist]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[insert_to_view_table]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[insert_to_view_table]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[question_1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[question_1]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[removelastrow]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[removelastrow]
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


CREATE PROCEDURE Create_temp_table
AS

Create TABLE templatting
(view_name nvarchar(40) primary key,
type nvarchar(40) ,
cond1 nvarchar (100),
cond2 nvarchar (100)
)



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


CREATE PROCEDURE Drop_temp_table AS

drop table templatting

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE getviewlist

AS
SELECT *
FROM sysobjects
WHERE (type = 'v') and name like 'A' + '%'
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO


CREATE PROCEDURE insert_to_view_table
(@V_name nvarchar(40) ,
@V_type nvarchar(40) ,
@V_cond1 nvarchar (100),
@V_cond2 nvarchar (100)
)
AS
insert into templatting (view_name,type ,cond1,cond2) values (@V_name,@V_type,@V_cond1,@V_cond2)



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE question_1
AS

select c_name,c_city from customer where c_name=(select c_name from borrow where loan_no is not NULL)


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

CREATE PROCEDURE removelastrow
@vname varchar(40)
AS
if exists ( select * from templatting where view_name=@vname)
delete templatting where view_name=@vname
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

AminSobati
یک شنبه 28 فروردین 1384, 22:24 عصر
دوست عزیزم،
نکته اول اینکه برای تفکیک فیلدهای همنام، میتونین در خود ساختار View، نام مستعار تعریف کنین. مثال:

CREATE VIEW MyView1 (Col1, Col2) AS
SELECT customerid,customerid FROM northwind.dbo.customers
نکته دوم، اگر نیاز به جدول موقتی دارین، میتونین نام جدول رو با علامت # شروع کنین. این باعث میشه که جدول برای اون Connection تعریف بشه و با بسته شدن Connection جدول به طور اتوماتیک حذف میشه.
اگر چند کاربر همزمان جدولی به اسم MyTable# ایجاد کنند، هر کدوم فقط جدول خودشون رو میبنند.
در مورد یک View برای همه جداول، لطفا بیشتر توضیح بدین..دقیقا چه کاری قصد دارین انجام بدین؟
موفق باشید

phantasm
دوشنبه 29 فروردین 1384, 20:08 عصر
امین جان از توجه ات ممنونم ,

من میخوام یه جمله join بدون توجه به فیلدهای هر کدام از جدولها بنویسم به نحوی که در جواب فقط یکبار فیلد مشترک تکرار (در تصویر فیلد c_name) شود یا حداقل یکی از آنها به نام دیگری تغیر کند.

titbasoft
سه شنبه 30 فروردین 1384, 12:18 عصر
یک مقدار شرط دومتون بعد از ON برای من تکراری به نظر میرسه ولی به هر حال با یه کم حدس زدن فیلدهاتون من به این نتیجه رسیدم:

SELECT b.c_name,b.b_name,b.loan_no,b.amount,d.account_no, d.balance FROM borrow b INNER JOIN deposit d ON b.c_name=d.c_name