PDA

View Full Version : جستجوی پیشرفته



cactuskhan
یک شنبه 04 اردیبهشت 1390, 13:58 عصر
سلام

در نظر بگیرید ما 20 تا جدول داریم که هر کدام یکسری فیلد دارن که یکی از اونها فیلد عنوان آست (Title) حالا کاربر یک فرم جستجو با 20 فیلد داره که ممکنه یکی از اون ها یا همه اونهارو پر کنه query این جستجو رو میخوام با like بنویسم
لطفا راهنمایی بفرمایین
ممنون از شما

m_omrani
یک شنبه 04 اردیبهشت 1390, 16:07 عصر
شاید بشه از union استفاده کرد:

select 1 as TableCode,ID,Title from Table1 where Title like '%'+@Title+'%'
union all
select 2 as TableCode,ID,Title from Table2 where Title like '%'+@Title+'%'
union all
...
union all
select 20 as TableCode,ID,Title from Table20 where Title like '%'+@Title+'%'

در اینجا من برای هر دستور select یک ستون جدید به اسم TableCode اضافه کردم و در هر کوئری بسته به جدول مورد استفاده یک مقدار یا کُد منحصر به فرد براش قرار دادم. بر اساس این کُد و مقدار کلید رکورد هر جدول (ستون ID) می تونید یه صفحه جزئیات جستجو درست کنید و این دو مقدار رو بهش پاس بدید تا بعد توی اون صفحه، دیتای کامل رکورد رو استخراج کرده و به کاربر نمایش بدید.

cactuskhan
دوشنبه 05 اردیبهشت 1390, 11:25 صبح
جواب نداد اینکار باعث تکرار میشه !

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go




--------------------------------------------------
-- Select All Rows
--------------------------------------------------
ALTER PROCEDURE [dbo].[Master_Masters_SearchAdv]
@Name NVARCHAR(512),
@LastName NVARCHAR(512),
@Thesis NVARCHAR(512),
@AcademicBackground NVARCHAR(512),
@Resume NVARCHAR(512),
@TeachingExperiences NVARCHAR(512),
@ResearchProjects NVARCHAR(512),
@NationalAssociations NVARCHAR(512),
@Seminar NVARCHAR(512),
@ExperimentalSkills NVARCHAR(512),
@Articles NVARCHAR(512),
@Workshops NVARCHAR(512),
@Trade NVARCHAR(512),
@Publications NVARCHAR(512),
@Awards NVARCHAR(512),
@Work NVARCHAR(512)
AS
BEGIN
SET NOCOUNT ON;

SELECT DISTINCT 'Master_Masters' AS tableName, dbo.Master_Masters.Id FROM dbo.Master_Masters WHERE
(dbo.Master_Masters.Name LIKE N'%'+@Name+'%' OR dbo.Master_Masters.Family LIKE N'%'+@LastName+'%' )

UNION ALL
SELECT 'Master_AcademicBackground' AS tableName, dbo.Master_AcademicBackground.MasterId FROM dbo.Master_AcademicBackground WHERE
dbo.Master_AcademicBackground.FieldTitle LIKE N'%'+@AcademicBackground+'%' OR Master_AcademicBackground.FieldTitle LIKE ''

UNION ALL
SELECT 'Master_Articles' AS tableName, dbo.Master_Articles.MasterId FROM dbo.Master_Articles WHERE
dbo.Master_Articles.Title LIKE N'%'+@Articles+'%' OR Master_Articles.Title LIKE ''
UNION ALL
SELECT 'Master_Awards' AS tableName, dbo.Master_Awards.MasterId FROM dbo.Master_Awards WHERE
dbo.Master_Awards.Title LIKE N'%'+@Awards+'%' OR Master_Awards.Title LIKE ''

UNION ALL
SELECT 'Master_ExperimentalSkills' AS tableName, dbo.Master_ExperimentalSkills.MasterId FROM dbo.Master_ExperimentalSkills WHERE
dbo.Master_ExperimentalSkills.Title LIKE N'%'+@ExperimentalSkills+'%' OR Master_ExperimentalSkills.Title LIKE ''
UNION ALL
SELECT 'Master_NationalAssociations' AS tableName, dbo.Master_NationalAssociations.MasterId FROM dbo.Master_NationalAssociations WHERE
dbo.Master_NationalAssociations.Institution LIKE N'%'+@NationalAssociations+'%' OR Master_NationalAssociations.Institution LIKE ''
UNION ALL
SELECT 'Master_Publications' AS tableName, dbo.Master_Publications.MasterId FROM dbo.Master_Publications WHERE
dbo.Master_Publications.Url LIKE N'%'+@Publications+'%' OR Master_Publications.Url LIKE ''
UNION ALL
SELECT 'Master_ResearchProjects' AS tableName, dbo.Master_ResearchProjects.MasterId FROM dbo.Master_ResearchProjects WHERE
dbo.Master_ResearchProjects.Title LIKE N'%'+@ResearchProjects+'%' OR Master_ResearchProjects.Title LIKE ''
UNION ALL
SELECT 'Master_Resume' AS tableName, dbo.Master_Resume.MasterId FROM dbo.Master_Resume WHERE
dbo.Master_Resume.Title LIKE N'%'+@Resume+'%' OR Master_Resume.Title LIKE ''
UNION ALL
SELECT 'Master_Seminar' AS tableName, dbo.Master_Seminar.MasterId FROM dbo.Master_Seminar WHERE
dbo.Master_Seminar.Title LIKE N'%'+@Seminar+'%' OR Master_Seminar.Title LIKE ''
UNION ALL
SELECT 'Master_TeachingExperiences' AS tableName, dbo.Master_TeachingExperiences.MasterId FROM dbo.Master_TeachingExperiences WHERE
dbo.Master_TeachingExperiences.Title LIKE N'%'+@TeachingExperiences+'%' OR Master_TeachingExperiences.Title LIKE ''
UNION ALL
SELECT 'Master_TeachingExperiences' AS tableName, dbo.Master_TeachingExperiences.MasterId FROM dbo.Master_TeachingExperiences WHERE
dbo.Master_TeachingExperiences.Title LIKE N'%'+@TeachingExperiences+'%' OR Master_TeachingExperiences.Title LIKE ''
UNION ALL
SELECT 'Master_Thesis' AS tableName, dbo.Master_Thesis.MasterId FROM dbo.Master_Thesis WHERE
dbo.Master_Thesis.ThesisTitle LIKE N'%'+@Thesis+'%' OR Master_Thesis.ThesisTitle LIKE ''
UNION ALL
SELECT 'Master_Trade' AS tableName, dbo.Master_Trade.MasterId FROM dbo.Master_Trade WHERE
dbo.Master_Trade.Title LIKE N'%'+@Trade+'%' OR Master_Trade.Title LIKE ''
UNION ALL
SELECT 'Master_Works' AS tableName, dbo.Master_Works.MasterId FROM dbo.Master_Works WHERE
dbo.Master_Works.Title LIKE N'%'+@Work+'%' OR Master_Works.Title LIKE ''
UNION ALL
SELECT 'Master_Workshops' AS tableName, dbo.Master_Workshops.MasterId FROM dbo.Master_Workshops WHERE
dbo.Master_Workshops.Name LIKE N'%'+@Workshops+'%' OR Master_Workshops.Name LIKE ''



END







http://www.novinupload.com/do.php?img=4609

اگر راه حل دیگه ای هست لطفا راهنمایی بفرمایید

m_omrani
دوشنبه 05 اردیبهشت 1390, 14:04 عصر
اگه کلید رکورد جداول رو برای ستون ID استفاده کنی تکراری نمی ده.
چون ترکیب TableName و ID منحصر به فرد می شه.

cactuskhan
دوشنبه 05 اردیبهشت 1390, 15:46 عصر
این کاری که شما گفتید رو کردم ! تکرار از بین رفت! اما...
یک اشکال وجود دارد اونم اینکه هر select بصورت مجزا زده می شود ! یعنی پاسخ هر select با select دیگر And نمی شود. متوجه منظورم می شوید؟
یعنی اگر من 3 تا پارامتر رو ارسال کردم و بقیه خالی بود درخواستم این است که در result رکورد هایی بیایند که هر سه مورد شرط را دارا باشد .

Reza_Yarahmadi
دوشنبه 05 اردیبهشت 1390, 17:43 عصر
دوست عزیز من دقیقا متوجه منظورتون نشدم! اگر قراره پارامترها بصورت پویا مورد بررسی قرار بگیره یعنی اینکه هر بار تعدادی از پارامترها ارسال میشه ، ابتدا باید تعداد پارامتر ارسالی محاسبه بشه سپس خروجی بررسی بشه که از همه جدولها خونده یا نه (به ازا هر پارامتر جوابی داریم یا نه).
برای محاسبه تعداد پارامتر که یا باید از طرف برنامه به عنوان یک پارامتر اضافی ارسال بشه و یا اینکه توی SP دونه دونه بررسی بشه که محتوا داره یا نه.
برای بررسی نتیجه هم میتونید بصورت زیر عمل کنید
With res as(
Select 'Table1' as TableName, ... From Table1 Where ...
Union All
Select 'Table2' as TableName, ... From Table2 Where ...
Union All
Select 'Table3' as TableName, ... From Table3 Where ...
)
Select * From res Where (Select Count(Distinct TableName) From res) = 3

cactuskhan
دوشنبه 05 اردیبهشت 1390, 18:05 عصر
خیر، هر بار تمامی پارامتر ها ارسال میشه ولی ممکنه یکی یا چند تا یا همه اونها مقدار داشته باشند در غیر اینصورت مقدار آن خالی است ''=parameter@
(حق با شماست توضیح آن یک مقدار سخت است )
در راه حلی که دوستمان پیشنهاد دادند این اشکال پیش می آید که هر کدام از select ها بصورت مجزا بررسی می شود ! یعنی اگر 3 تا از پارامتر های من مقدار داشت در result که به من می دهد این 3 مقدار با هم AND نیستند بلکه OR هستند. در حالیکه باید به جدول اول نگاه کند و بگوید کدام ID از جدول اول در جداول دیگر وجود دارد که هر سه شرط در آن جدول ها برقرار باشد.

صورت مسئله این است :

یک جدول استاد وجود دارد با یکسری فیلد به همراه چند جدول که هر کدام یکسری از مواردی که مربوط به استاد می شود را نگه می دارد (مثلا: آثار استاد ،مقالات استاد،نمایشگاهای استاد و .... )
حالا ما یک فرم جستجو پیشرفته داریم که در آن کلی فیلد است میخواهیم کاربر با دانستن نام یک نمایشگاه یا نام یک مقاله بتواند استاد مربوطه را پیدا کند(اینجا همانجایی است که ممکن است تمام فیلد ها را پر کند یا یکی از آنها را پر کند)

امیدوارم مسئله روشن شده باشد
ممنون می شم راهنمایی کنید بد جوری گیر کردم

Reza_Yarahmadi
دوشنبه 05 اردیبهشت 1390, 18:26 عصر
منظور من از ارسال شدن ، ارسال مقدار معنی دار بود (در صورتی که حتی یکی از پارامترها ارسال نمیشد برنامه شما خطا میداد)
در صورتی که کار با پیدا کردن کد استاد حل میشه بصورت زیر عمل کرد.
Declare @Params int
Set @Params = 0

IF(@Name <> '')
Set @Params = @Params + 1
IF(@LastName <> '')
Set @Params = @Params + 1
IF(@Thesis <> '')
Set @Params = @Params + 1
.
.
.
.


;With res as(
SELECT DISTINCT
'Master_Masters' AS tableName,
dbo.Master_Masters.Id
FROM
dbo.Master_Masters
WHERE
dbo.Master_Masters.Name LIKE N'%' + @Name + '%'
OR
dbo.Master_Masters.Family LIKE N'%' + @LastName + '%'

UNION ALL
.
.
.
.
)
Select ID From res
Group By ID
Having Count(Distinct TableName) = @Params

m_omrani
دوشنبه 05 اردیبهشت 1390, 19:03 عصر
مطلبی که در مورد AND شدن نتایج هر select می گویید یک چیز کاملاً متفاوت نسبت به صوت اولیه سوال است. برای AND کردن نتایج می توانید از عملگر EXISTS استفاده کنید. مثلاً این را دقت کنید:

SELECT 'Table1' AS tableName,ID,Title FROM Table1
WHERE (Title LIKE '%' + @Title1 + '%')
AND EXISTS (SELECT 1 FROM Table2 WHERE Title LIKE '%' + @Title2 + '%')
AND EXISTS (SELECT 1 FROM Table3 WHERE Title LIKE '%' + @Title3 + '%')

در واقع در این حالت در شرط WHERE هر یک از پرس و جوهای SELECT باید تعدادی EXISTS اضافه کنید. طبعاً این مساله باعث پیچیده تر شدن کوئری می شود. چرا که ممکن است کاربر برخی از پارامترها را وارد نکند. لذا باید مثلاً چنین شرطی را هم اضافه کنید تا اگر پارامتری را هم وارد نکرد، جستجو به هر حال نتیجه بدهد:


SELECT 'Table1' AS tableName,ID,Title FROM Table1
WHERE (Title LIKE '%' + @Title + '%')
AND
(
EXISTS (SELECT 1 FROM Table2 WHERE Title LIKE '%' + @Title2 + '%')
OR
LTRIM(RTRIM(ISNULL(@Title2,''))) = ''
)
AND
(
EXISTS (SELECT 1 FROM Table3 WHERE Title LIKE '%' + @Title3 + '%')
OR
LTRIM(RTRIM(ISNULL(@Title3,''))) = ''
)

با توجه به زیاد بودن تعداد جداول، پرس و جوی نهایی شما که از UNION ALL تمامی SELECT ها به دست می آید بسیار پیچیده خواهد شد. لذا ضمن این که به نظرم در فرم جستجو حتماً باید حالت پیشرفته هم بگذارید تا کاربر دقیقاً مشخص کند که جستجو چطوری انجام شود، بهتر است پرس و جو را به صورت Dynamic انجام بدهید.

محمد سلیم آبادی
دوشنبه 05 اردیبهشت 1390, 20:27 عصر
دلیل خاصی وجود داره که مقادیر تکراری اجتماع بشن (توسط ALL) سپس دوباره توسط DISTINCT حذف بشن

m_omrani
دوشنبه 05 اردیبهشت 1390, 20:30 عصر
به عقیده من SELECT DISTINCT نهایی بی تاثیره و جز سربار حاصلی نداره. چون ترکیب TableName + ID در هر رکورد منحصر به فرده. SELECT DISTINCT رو هم ظاهراً جناب cactuskhan به دلیل این که در ابتدا در رکوردهای برگشتی مقادیر تکراری مشاهده می کردن اضافه کردن. ولی واقعیتش اینه که نیازی بهش نیست.

محمد سلیم آبادی
دوشنبه 05 اردیبهشت 1390, 20:39 عصر
طبق این گفته ها
>>
یک جدول استاد وجود دارد با یکسری فیلد به همراه چند جدول که هر کدام یکسری از مواردی که مربوط به استاد می شود را نگه می دارد (مثلا: آثار استاد ،مقالات استاد،نمایشگاهای استاد و .... )
حالا ما یک فرم جستجو پیشرفته داریم که در آن کلی فیلد است میخواهیم کاربر با دانستن نام یک نمایشگاه یا نام یک مقاله بتواند استاد مربوطه را پیدا کند(اینجا همانجایی است که ممکن است تمام فیلد ها را پر کند یا یکی از آنها را پر کند)
<<

اول اینکه باید حتما از روش های جستجوی پویا برای حل مساله استفاده بشه. و از طرفی نیازی به union و غیره نیست کافیه تمام جداول فرعی را با جدول اصلی که همان استاد هست Join کرد تا به تمام خصیصه های مورد نیاز در یک سطر دسترسی داشته باشیم و کار را ساده به پیش ببریم.

Reza_Yarahmadi
دوشنبه 05 اردیبهشت 1390, 21:06 عصر
اول اینکه باید حتما از روش های جستجوی پویا برای حل مساله استفاده بشه. و از طرفی نیازی به union و غیره نیست کافیه تمام جداول فرعی را با جدول اصلی که همان استاد هست Join کرد تا به تمام خصیصه های مورد نیاز در یک سطر دسترسی داشته باشیم و کار را ساده به پیش ببریم.
جناب msalim
Join کردن تعداد زیادی جدول (بیش از 3 جدول) از نظر زمانی سربار زیادی داره ، چند جستجوی مستقل که باهم جمع میشن به مراتب از نظر زمانی یه صرفه تره.
در مورد استفاده از Union All و Union هم بدلیل اینکه در Union All هزینه ای بابت بررسی نتیجه های جستجو باهم صرف نمیشه برای این مثال مناسبتره.

محمد سلیم آبادی
دوشنبه 05 اردیبهشت 1390, 21:14 عصر
>>
در مورد استفاده از Union All و Union هم بدلیل اینکه در Union All هزینه ای بابت بررسی نتیجه های جستجو باهم صرف نمیشه برای این مثال مناسبتره.
<<
درسته، ولی همانطور که در پست شماره 11 اشاره شد کلید واژه Distinct کاملا اضافه بنظر میرسه.

cactuskhan
سه شنبه 06 اردیبهشت 1390, 09:04 صبح
از خط آخر یک Error می گیره


--------------------------------------------------
-- Select All Rows
--------------------------------------------------
ALTER PROCEDURE [dbo].[Master_Masters_SearchAdv]
@Name NVARCHAR(512) ,
@LastName NVARCHAR(512) ,
@Thesis NVARCHAR(512) ,
@AcademicBackground NVARCHAR(512) ,
@Resume NVARCHAR(512) ,
@TeachingExperiences NVARCHAR(512) ,
@ResearchProjects NVARCHAR(512) ,
@NationalAssociations NVARCHAR(512) ,
@Seminar NVARCHAR(512) ,
@ExperimentalSkills NVARCHAR(512) ,
@Articles NVARCHAR(512) ,
@Workshops NVARCHAR(512) ,
@Trade NVARCHAR(512) ,
@Publications NVARCHAR(512) ,
@Awards NVARCHAR(512) ,
@Work NVARCHAR(512),
@EducationalDocuments NVARCHAR(512)
AS
BEGIN
SET NOCOUNT ON ;
Declare @Params int
Set @Params = 0

IF(@Name <> '')
Set @Params = @Params + 1
IF(@LastName <> '')
Set @Params = @Params + 1
IF(@Thesis <> '')
Set @Params = @Params + 1
IF(@AcademicBackground <> '')
Set @Params = @Params + 1
IF(@Resume <> '')
Set @Params = @Params + 1
IF(@TeachingExperiences <> '')
Set @Params = @Params + 1
IF(@ResearchProjects <> '')
Set @Params = @Params + 1
IF(@NationalAssociations <> '')
Set @Params = @Params + 1
IF(@Seminar <> '')
Set @Params = @Params + 1
IF(@ExperimentalSkills <> '')
Set @Params = @Params + 1
IF(@Articles <> '')
Set @Params = @Params + 1
IF(@Work <> '')
Set @Params = @Params + 1
IF(@Workshops <> '')
Set @Params = @Params + 1
IF(@Trade <> '')
Set @Params = @Params + 1
IF(@Publications <> '')
Set @Params = @Params + 1
IF(@Awards <> '')
Set @Params = @Params + 1
IF(@EducationalDocuments<> '')
Set @Params = @Params + 1

;
WITH res AS (
SELECT DISTINCT 'Master_Masters' AS tableName, dbo.Master_Masters.Id FROM dbo.Master_Masters
WHERE
(dbo.Master_Masters.Name LIKE N'%'+@Name+'%' OR dbo.Master_Masters.Family LIKE N'%'+@LastName+'%')

UNION ALL
SELECT 'Master_AcademicBackground' AS tableName, dbo.Master_AcademicBackground.Id FROM dbo.Master_AcademicBackground WHERE
dbo.Master_AcademicBackground.FieldTitle LIKE N'%'+@AcademicBackground+'%'

UNION ALL
SELECT 'Master_Trade' AS tableName, dbo.Master_Trade.Id FROM dbo.Master_Trade WHERE
dbo.Master_Trade.Title LIKE N'%'+@Trade+'%'
UNION ALL
SELECT 'Master_Articles' AS tableName, dbo.Master_Articles.Id FROM dbo.Master_Articles WHERE
dbo.Master_Articles.Title LIKE N'%'+@Articles+'%'
UNION ALL
SELECT 'Master_Awards' AS tableName, dbo.Master_Awards.Id FROM dbo.Master_Awards WHERE
dbo.Master_Awards.Title LIKE N'%'+@Awards+'%'
UNION ALL
SELECT 'Master_EducationalDocuments' AS tableName, dbo.Master_EducationalDocuments.Id FROM dbo.Master_EducationalDocuments WHERE
dbo.Master_EducationalDocuments.CourseTitle LIKE N'%'+@EducationalDocuments+'%'
UNION ALL
SELECT 'Master_ExperimentalSkills' AS tableName, dbo.Master_ExperimentalSkills.Id FROM dbo.Master_ExperimentalSkills WHERE
dbo.Master_ExperimentalSkills.Title LIKE N'%'+@ExperimentalSkills+'%'
UNION ALL
SELECT 'Master_NationalAssociations' AS tableName, dbo.Master_NationalAssociations.Id FROM dbo.Master_NationalAssociations WHERE
dbo.Master_NationalAssociations.Institution LIKE N'%'+@NationalAssociations+'%'
UNION ALL
SELECT 'Master_Publications' AS tableName, dbo.Master_Publications.Id FROM dbo.Master_Publications WHERE
dbo.Master_Publications.Url LIKE N'%'+@Publications+'%'
UNION ALL
SELECT 'Master_ResearchProjects' AS tableName, dbo.Master_ResearchProjects.Id FROM dbo.Master_ResearchProjects WHERE
dbo.Master_ResearchProjects.Title LIKE N'%'+@ResearchProjects+'%'
UNION ALL
SELECT 'Master_Resume' AS tableName, dbo.Master_Resume.Id FROM dbo.Master_Resume WHERE
dbo.Master_Resume.Field LIKE N'%'+@Resume+'%'
UNION ALL
SELECT 'Master_Seminar' AS tableName, dbo.Master_Seminar.Id FROM dbo.Master_Seminar WHERE
dbo.Master_Seminar.Title LIKE N'%'+@Seminar+'%'
UNION ALL
SELECT 'Master_TeachingExperiences' AS tableName, dbo.Master_TeachingExperiences.Id FROM dbo.Master_TeachingExperiences WHERE
dbo.Master_TeachingExperiences.Title LIKE N'%'+@TeachingExperiences+'%'
UNION ALL
SELECT 'Master_Thesis' AS tableName, dbo.Master_Thesis.Id FROM dbo.Master_Thesis WHERE
dbo.Master_Thesis.ThesisTitle LIKE N'%'+@Thesis+'%'
UNION ALL
SELECT 'Master_Trade' AS tableName, dbo.Master_Trade.Id FROM dbo.Master_Trade WHERE
dbo.Master_Trade.Title LIKE N'%'+@Trade+'%'
UNION ALL
SELECT 'Master_Works' AS tableName, dbo.Master_Works.Id FROM dbo.Master_Works WHERE
dbo.Master_Works.Title LIKE N'%'+@Work+'%'
UNION ALL
SELECT 'Master_Workshops' AS tableName, dbo.Master_Workshops.Id FROM dbo.Master_Workshops WHERE
dbo.Master_Workshops LIKE N'%'+@Workshops+'%'
)
Select ID From res Group By ID
Having Count(Distinct tableName) = @Params







اینم error


Msg 102, Level 15, State 1, Procedure Master_Masters_SearchAdv, Line 120
Incorrect syntax near '@Params'.

Reza_Yarahmadi
سه شنبه 06 اردیبهشت 1390, 18:25 عصر
شما اول کدتون Begin گذاشتید ولی End آخرش رو نذاشتید. با گذاشتن اون مشکل برطرف میشه.

cactuskhan
سه شنبه 06 اردیبهشت 1390, 18:57 عصر
حق با شما بود error رفع شد ولی نتیجه همچنان اشتباه است :عصبانی++:

m_omrani
سه شنبه 06 اردیبهشت 1390, 21:28 عصر
نمی دونم. نظرتون راجع به روشی که من پیشنهاد کردم چیه؟ (استفاده از exists و dynamic query)

من یه SP نمونه نوشتم. سه تا جدول داریم به نام های Table1 و Table2 و Table3. هر سه شبیه هم هستند (دارای ستون های ID,Title). چهار تا پارامتر به SP می دیم. @Title1 و @Title2 و @Title3. هر کدوم برای جستجوی عنوان در یک جدول به کار می ره. پارامتر چهارم هم @and نام داره که اگه 1 باشه، عمل جستجو در هر سه جدول انجام می شه (با عملگر and). من قسمت آخر اجرای پرس و جوی داینامیک رو کامنت کردم و به جاش قبلش کوئری تولید شده نهایی رو print کردم. می تونین با اجرای SP با مقادیر مختلف برای پارامترهاش، کوئری نتیجه رو چک کنین.

create procedure advancedSearch
(
@Title1 varchar(100)='',
@Title2 varchar(100)='',
@Title3 varchar(100)='',
@and bit=0 -- 0: no, 1: yes
)
as
begin
declare @sql varchar(max)

set @sql = ''
set @sql = @sql + 'select ''t1'' as TableName,ID,Title from Table1
where Title like ''%''+@Title1+''%''
'
if @and = 1
begin
if ltrim(rtrim(isnull(@Title2,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table2 where Title like ''%''+@Title2+''%'')'
if ltrim(rtrim(isnull(@Title3,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table3 where Title like ''%''+@Title3+''%'')'
end
set @sql = @sql + '
union all
'
set @sql = @sql + 'select ''t2'' as TableName,ID,Title from Table2
where Title like ''%''+@Title2+''%''
'
if @and = 1
begin
if ltrim(rtrim(isnull(@Title1,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table1 where Title like ''%''+@Title1+''%'')'
if ltrim(rtrim(isnull(@Title3,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table3 where Title like ''%''+@Title3+''%'')'
end
set @sql = @sql + '
union all
'
set @sql = @sql + 'select ''t3'' as TableName,ID,Title from Table3
where Title like ''%''+@Title3+''%'''
if @and = 1
begin
if ltrim(rtrim(isnull(@Title1,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table1 where Title like ''%''+@Title1+''%'')'
if ltrim(rtrim(isnull(@Title2,'')))<>''
set @sql = @sql + ' and exists(select 1 from Table2 where Title like ''%''+@Title2+''%'')'
end

print @sql
--exec sp_executesql @sql,'@Title1 varchar(100),@Title2 varchar(100),@Title3 varchar(100)',
-- @Title1=@Title1,@Title2=@Title2,@Title3=#Title3
end

cactuskhan
پنج شنبه 08 اردیبهشت 1390, 10:33 صبح
مشکل با یک LEFT JOIN حل شد


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


--------------------------------------------------
-- Select All Rows
--------------------------------------------------
ALTER PROCEDURE [dbo].[Master_Masters_SearchAdv]
@Name NVARCHAR(512) =null,
@LastName NVARCHAR(512) =null,
@Thesis NVARCHAR(512) =null,
@AcademicBackground NVARCHAR(512) =null,
@Resume NVARCHAR(512) =null,
@TeachingExperiences NVARCHAR(512) =null,
@ResearchProjects NVARCHAR(512) =null,
@NationalAssociations NVARCHAR(512) =null,
@Seminar NVARCHAR(512) =null,
@ExperimentalSkills NVARCHAR(512)=null ,
@Articles NVARCHAR(512) =null,
@Workshops NVARCHAR(512) =null,
@Trade NVARCHAR(512) =null,
@Publications NVARCHAR(512) =null,
@Awards NVARCHAR(512) =null,
@Work NVARCHAR(512) =null,
@EducationalDocuments NVARCHAR(512)=null
AS

SELECT DISTINCT dbo.Master_Masters.*
FROM dbo.Master_Masters
LEFT JOIN Master_AcademicBackground ON Master_Masters.Id = Master_AcademicBackground.MasterId
LEFT JOIN Master_Articles ON Master_Masters.Id = Master_Articles.MasterId
LEFT JOIN Master_ExperimentalSkills ON Master_Masters.Id = Master_ExperimentalSkills.MasterId
LEFT JOIN Master_NationalAssociations ON Master_Masters.Id = Master_NationalAssociations.MasterId
LEFT JOIN Master_Publications ON Master_Masters.Id = Master_Publications.MasterId
LEFT JOIN Master_ResearchProjects ON Master_Masters.Id = Master_ResearchProjects.MasterId
LEFT JOIN Master_Resume ON Master_Masters.Id = Master_Resume.MasterId
LEFT JOIN Master_Seminar ON Master_Masters.Id = Master_Seminar.MasterId
LEFT JOIN Master_TeachingExperiences ON Master_Masters.Id = Master_TeachingExperiences.MasterId
LEFT JOIN Master_Thesis ON Master_Masters.Id = Master_Thesis.MasterId
LEFT JOIN Master_Trade ON Master_Masters.Id = Master_Trade.MasterId
LEFT JOIN Master_Works ON Master_Masters.Id = Master_Works.MasterId
LEFT JOIN Master_Workshops ON Master_Masters.Id = Master_Workshops.MasterId
LEFT JOIN dbo.Master_Awards ON Master_Masters.Id = dbo.Master_Awards.MasterId
WHERE (dbo.Master_Masters.Name LIKE N'%'+@Name+'%' OR @Name IS NULL)
AND (dbo.Master_Masters.Family LIKE N'%'+@LastName+'%' OR @LastName IS NULL)
AND (dbo.Master_AcademicBackground.FieldTitle LIKE N'%'+@AcademicBackground+'%' OR @AcademicBackground IS NULL)
AND (@Articles IS NULL OR dbo.Master_Articles.Title LIKE '%' + @Articles + '%')
AND (dbo.Master_ExperimentalSkills.Title LIKE N'%'+@ExperimentalSkills+'%' OR @ExperimentalSkills IS NULL)
AND (dbo.Master_NationalAssociations.Institution LIKE N'%'+@NationalAssociations+'%' OR @NationalAssociations IS NULL)
AND (dbo.Master_Publications.Url LIKE N'%'+@Publications+'%' OR @Publications IS NULL)
AND (dbo.Master_ResearchProjects.Title LIKE N'%'+@ResearchProjects+'%' OR @ResearchProjects IS NULL)
AND (@Resume IS NULL OR dbo.Master_Resume.Title LIKE '%' + @Resume + '%')
AND (dbo.Master_Seminar.Title LIKE N'%'+@Seminar+'%' OR @Seminar IS NULL)
AND (dbo.Master_TeachingExperiences.Field LIKE N'%'+@ExperimentalSkills+'%' OR @ExperimentalSkills IS NULL)
AND (dbo.Master_Thesis.ThesisTitle LIKE N'%'+@Thesis+'%' OR @Thesis IS NULL)
AND (dbo.Master_Trade.Title LIKE N'%'+@Trade+'%' OR @Trade IS NULL)
AND (dbo.Master_Works.Title LIKE N'%'+@Work+'%' OR @Work IS NULL)
AND (dbo.Master_Workshops.Name LIKE N'%'+@Workshops+'%' OR @Workshops IS NULL)
AND (dbo.Master_Awards.Title LIKE N'%'+@Awards+'%' OR @Awards IS NULL)

mhdhp86
دوشنبه 13 شهریور 1391, 22:30 عصر
من یک فرم جستجو مثل مشکلی که اینجا مطرح شده دارم...اما همه اطلاعات توی یک جدوله... حالا چطور کوئری رو بنویسم؟