PDA

View Full Version : اشکال در یک query (لطفا کمک کنید )



saba79
یک شنبه 16 بهمن 1384, 14:56 عصر
سلام

می می خوام یک query بنویسم با استفاده از 2 تا select و دستور NOT EXISTS یعنی در واقع می خوام رکوردهایی را بیاورد که در select اول موجود و در دومی موجود نباشد ...هر کدام از select ها به تنهایی جواب می دهد ولی ترکیب آنها با دستور NOT EXISTS چیزی بر نمی گرداند ؟

چرا این اتفاق می افتد ..ممنون میشم راهنمایی کنید .

Elham_gh
یک شنبه 16 بهمن 1384, 15:04 عصر
احتمالا شرط query هایتان یکسان است و یا خروجی هر دو Select یکی است.
برای اظهار نظر دقیقتر query را اینجا کپی کنید.

saba79
یک شنبه 16 بهمن 1384, 15:09 عصر
مقداری را که هر کدام از select ها به تنهایی بر می گردانند درست است!!!

SELECT dbo.tblCustInfoFromMain.fldCodeNo,'84 ',
dbo.tblPhResivedTemp1.fldCycleNo,'02',dbo.tblCustI nfoFromMain.fldCustType,
dbo.tblCustInfoFromMain.fldFolderNo, dbo.tblPhResivedTemp1.fldBranchCode,
'0' + dbo.tblPhResivedTemp1.fldReciveAmt AS Amt,dbo.tblPhResivedTemp1.fldDate,
'15',dbo.tblPhResivedTemp1.fldSearchNo,dbo.tblPhRe sivedTemp1.fldReciveNo,
dbo.tblPhResivedTemp1.fldResiveDate
FROM dbo.tblPhResivedTemp1 INNER JOIN dbo.tblCustInfoFromMain ON
dbo.tblPhResivedTemp1.fldCodeNo = LEFT(dbo.tblCustInfoFromMain.fldCodeNo, 7)
WHERE NOT EXISTS (SELECT dbo.tblPhResivedTemp1.fldCodeNo, dbo.tblPhResivedTemp1.fldCycleNo,
dbo.tblPhResivedTemp1.fldDate, dbo.tblPhResivedTemp1.fldBranchCode,
dbo.tblPhResivedTemp1.fldSearchNo, dbo.tblPhResivedTemp1.fldResiveDate,
dbo.tblPhResivedTemp1.fldReciveNo, dbo.tblPhResivedTemp1.fldUserId,
dbo.tblPhResivedTemp1.fldChannelType, dbo.tblPhResivedTemp1.fldCompanySecCode,
dbo.tblPhResivedTemp1.fldCompanyDist, dbo.tblPhResivedTemp1.fldCompanyCode,
dbo.tblPhResivedTemp1.fldDigit, dbo.tblPhResivedTemp1.fldYear,
dbo.tblPhResivedTemp1.fldumDigit, dbo.tblPhResivedTemp1.fldRefCode,
dbo.tblPhResivedTemp1.fldAmt, dbo.tblPhResivedTemp1.fldReciveAmt
FROM dbo.tblPhResivedTemp1 INNER JOIN dbo.tblPhRecived ON
dbo.tblPhResivedTemp1.fldCodeNo = LEFT(dbo.tblPhRecived.fldCodeNo, 7) AND
dbo.tblPhResivedTemp1.fldCycleNo = dbo.tblPhRecived.fldCycle AND
dbo.tblPhResivedTemp1.fldReciveAmt = RIGHT(dbo.tblPhRecived.fldRecivedAmt,12)And left(dbo.tblPhResivedTemp1.fldDate,2)=left(dbo.tbl PhRecived.fldDate,2 ))

Elham_gh
یک شنبه 16 بهمن 1384, 15:18 عصر
لطفا را در تگ کد (
)قرار دهید که قابل استفاده باشد.

saba79
یک شنبه 16 بهمن 1384, 15:32 عصر
...چطور؟.........

سید مسعود موحد
یک شنبه 16 بهمن 1384, 15:41 عصر
به اینصورت





SELECT dbo.tblCustInfoFromMain.fldCodeNo,'84 ',
dbo.tblPhResivedTemp1.fldCycleNo,'02',dbo.tblCustI nfoFromMain.fldCustType,
dbo.tblCustInfoFromMain.fldFolderNo, dbo.tblPhResivedTemp1.fldBranchCode,
'0' + dbo.tblPhResivedTemp1.fldReciveAmt AS Amt,dbo.tblPhResivedTemp1.fldDate,
'15',dbo.tblPhResivedTemp1.fldSearchNo,dbo.tblPhRe sivedTemp1.fldReciveNo,
dbo.tblPhResivedTemp1.fldResiveDate
FROM dbo.tblPhResivedTemp1 INNER JOIN dbo.tblCustInfoFromMain ON
dbo.tblPhResivedTemp1.fldCodeNo = LEFT(dbo.tblCustInfoFromMain.fldCodeNo, 7)
WHERE NOT EXISTS (SELECT dbo.tblPhResivedTemp1.fldCodeNo, dbo.tblPhResivedTemp1.fldCycleNo,
dbo.tblPhResivedTemp1.fldDate, dbo.tblPhResivedTemp1.fldBranchCode,
dbo.tblPhResivedTemp1.fldSearchNo, dbo.tblPhResivedTemp1.fldResiveDate,
dbo.tblPhResivedTemp1.fldReciveNo, dbo.tblPhResivedTemp1.fldUserId,
dbo.tblPhResivedTemp1.fldChannelType, dbo.tblPhResivedTemp1.fldCompanySecCode,
dbo.tblPhResivedTemp1.fldCompanyDist, dbo.tblPhResivedTemp1.fldCompanyCode,
dbo.tblPhResivedTemp1.fldDigit, dbo.tblPhResivedTemp1.fldYear,
dbo.tblPhResivedTemp1.fldumDigit, dbo.tblPhResivedTemp1.fldRefCode,
dbo.tblPhResivedTemp1.fldAmt, dbo.tblPhResivedTemp1.fldReciveAmt
FROM dbo.tblPhResivedTemp1 INNER JOIN dbo.tblPhRecived ON
dbo.tblPhResivedTemp1.fldCodeNo = LEFT(dbo.tblPhRecived.fldCodeNo, 7) AND
dbo.tblPhResivedTemp1.fldCycleNo = dbo.tblPhRecived.fldCycle AND
dbo.tblPhResivedTemp1.fldReciveAmt = RIGHT(dbo.tblPhRecived.fldRecivedAmt,12)And left(dbo.tblPhResivedTemp1.fldDate,2)=left(dbo.tbl PhRecived.fldDate,2

saba79
یک شنبه 16 بهمن 1384, 15:48 عصر
چرا این query جواب نمی ده ؟.......

سید مسعود موحد
یک شنبه 16 بهمن 1384, 16:08 عصر
چرا شما Select دوم خودتون را در یک View قرار نمیدهید بعد من در اینجور کد نویسی ها مشاهده کردم که ایراد کا در اطلاعات جمع شده در Select دوم است خیلی باید در فیلدهای هر دو SELECt دقت داشته باشی
باز در اینجا شایان ذکر است که یک امکان جدید دیگر از SQL2005 را نشان بدهم
دستور Except و INTERSECT که
دستور اول EXCEPT مقادیری که در SELECT اول وجود دارد و در دومی وجود ندارد را نشان میدهد
و دستور INTERSECT که فقط مقادیری را که در هر دو SELECT وجود دارد را نشان میدهد

کاربرد دستورات




CREATE TABLE projectPerson
(
personId VARCHAR(10),
projectId VARCHAR(10),
PRIMARY KEY (personId, projectId)
)
go
INSERT INTO projectPerson VALUES ('joeb','projBig')
INSERT INTO projectPerson VALUES ('joeb','projLittle')
INSERT INTO projectPerson VALUES ('fredf','projBig')
INSERT INTO projectPerson VALUES ('homerr','projLittle')
INSERT INTO projectPerson VALUES ('stevegr','projBig')
INSERT INTO projectPerson VALUES ('stevegr','projLittle')
go
So we can see that joeb worked on projBig and projLittle. Now we can write the following
queries. Using UNION, we could see who worked on one project or both projects:


SELECT personId
FROM projectPerson
WHERE projectId = 'projBig'
UNION
SELECT personId
FROM projectPerson
WHERE projectId = 'projLittle'
which returns the following:
personId
----------
fredf
homerr
joeb
stevegr
Next, if you want to see who worked only on projLittle, but not projBig, this was pretty ugly in
SQL Server 2000.
SELECT personId
FROM projectPerson as projLittle
WHERE projectId = 'projLittle'
AND NOT EXISTS ( SELECT *
FROM projectPerson as projBig
WHERE projBig.projectId = 'projBig'
and projBig.personId = projLittle.personId)
In 2005, you can run the following:
--worked on projBig but not projLittle
SELECT personId
FROM projectPerson
WHERE projectId = 'projLittle'
EXCEPT
SELECT personId
FROM projectPerson
WHERE projectId = 'projBig'
This returns the following:
personId
----------
homerr
Finally, say we want to see who worked only on both projects. In 2000, we need to run the query
we did for INTERSECT, and UNION the result with the opposite, which is just too messy to be of value
here. In 2005, the query is very straightforward:
SELECT personId
FROM projectPerson
WHERE projectId = 'projBig'
INTERSECT
SELECT personId
FROM projectPerson
WHERE projectId = 'projLittle'


This returns
personId
----------
joeb
stevegr

Elham_gh
یک شنبه 16 بهمن 1384, 16:25 عصر
شما احتیاج به NOT EXISTS ندارید. شما باید از Not In استفاده کنید. و برای استفاده از آن هم احتیاچ به چنین SELECT هایی نیست. بلکه SELECT دومی فقط کافیست شامل فیلدهای کلیدباشند.

saba79
دوشنبه 17 بهمن 1384, 09:17 صبح
mamnoon az not in estefade kardam moshkelam hal shod