Saya memiliki kueri yang ingin saya kecualikan serangkaian kombinasi tertentu. Dalam hal ini saya TIDAK ingin catatan di mana KEDUA id bulat dan nama cocok dengan nilai yang saya tentukan.

Sayangnya permintaan saya mengecualikan hasil apa pun yang memiliki satu ATAU yang lain (terlepas dari tanda kurung). Saya perhatikan saya hanya mendapatkan hasil yang tidak terduga dalam tanda kurung saat menggunakan '!=' untuk kedua variabel (ketika salah satu atau keduanya menggunakan '=' itu menghormati kedua kondisi seperti yang diharapkan).

Adakah yang bisa membantu saya menyesuaikan kueri sehingga satu-satunya hasil yang dikecualikan adalah yang cocok dengan kedua kriteria? Penjelasan mengapa apa yang saya lakukan salah juga akan dihargai. (Saya harus mengubah nama tabel tetapi mudah-mudahan masih dapat dibaca)

DECLARE @rn VARCHAR(20) = 'Value 1'
DECLARE @round NVARCHAR(15) = 'Value 2'

SELECT DISTINCT rfr.RFId, r2.Name ,dc.Code, r.RoundId
FROM review.RF rf
JOIN review.RFRound rfr ON rfr.RFId = rf.RFId AND ISNULL(rfr.IsDeleted,0)=0
JOIN review.Round r ON r.RoundAutoId = rfr.RoundAutoId
JOIN dc.DeficiencyCode dc ON dc.DeficiencyCodeId = rf.DeficiencyCodeId
JOIN review.SR sr ON sr.SRId = rf.SRId
JOIN reftype.Review r2 ON r2.ReviewId = sr.ReviewId
WHERE (r.RoundId != @round AND r2.Name != @rn) --it basically ignores my parenthesis
1
JMariña 17 Maret 2017, 18:07

2 jawaban

Jawaban Terbaik

Dalam hal ini saya TIDAK ingin catatan di mana KEDUA id bulat dan nama cocok dengan nilai yang saya tentukan.

Ubah != menjadi = untuk kedua kondisi dan awali tanda kurung Anda dengan not

declare @rn varchar(20) = 'Value 1';
declare @round nvarchar(15) = 'Value 2';

select distinct 
    rfr.RFId
  , r2.name
  , dc.Code
  , r.RoundId
from review.RF rf
  inner join review.RFRound rfr
    on rfr.RFId = rf.RFId and isnull(rfr.IsDeleted, 0) = 0
  inner join review.Round r
    on r.RoundAutoId = rfr.RoundAutoId
  inner join dc.DeficiencyCode dc
    on dc.DeficiencyCodeId = rf.DeficiencyCodeId
  inner join review.SR sr
    on sr.SRId = rf.SRId
  inner join reftype.Review r2
    on r2.ReviewId = sr.ReviewId
where not (
      r.RoundId = @round 
    and r2.name = @rn
  )

Untuk hanya menyertakan hasil yang hanya cocok dengan salah satu parameter, tambahkan

 and (
      r.RoundId = @round 
    or r2.name = @rn
  )

Mungkin (atau mungkin tidak) membantu untuk memikirkan tentang kondisi where Anda dalam hal Gerbang logika< /a>

Premis pertanyaan Anda adalah Anda menerapkan logika nand, yang merupakan kependekan dari not and, yang diterjemahkan menjadi not ( condition and condition ).

NAND:

+---+---+----------+
| A | B | A NAND B |
+---+---+----------+
| 0 | 0 |        1 |
| 0 | 1 |        1 |
| 1 | 0 |        1 |
| 1 | 1 |        0 |
+---+---+----------+
1
SqlZim 17 Maret 2017, 15:32

Menghapus '!' dari mana kondisimu

DECLARE @rn VARCHAR(20) = 'Value 1'
DECLARE @round NVARCHAR(15) = 'Value 2'

SELECT DISTINCT rfr.RFId, r2.Name ,dc.Code, r.RoundId
FROM review.RF rf
JOIN review.RFRound rfr ON rfr.RFId = rf.RFId AND ISNULL(rfr.IsDeleted,0)=0
JOIN review.Round r ON r.RoundAutoId = rfr.RoundAutoId
JOIN dc.DeficiencyCode dc ON dc.DeficiencyCodeId = rf.DeficiencyCodeId
JOIN review.SR sr ON sr.SRId = rf.SRId
JOIN reftype.Review r2 ON r2.ReviewId = sr.ReviewId
WHERE r.RoundId = @round 
  AND r2.Name = @rn
0
Vecchiasignora 17 Maret 2017, 15:14