как я могу сделать минус в этом запросе? - PullRequest
1 голос
/ 26 апреля 2011

Что-то не так в моем запросе, когда я делаю вычитание. Я использую MS SQL.

SELECT PT.PcbId
  FROM dbo.DeviceTrace DT  
  JOIN dbo.PcbTrace  PT ON DT.CompId = '101125937' 
                       AND DT.DeviceID = PT.DeviceID

NOT IN (SELECT PB.PcbId
          FROM dbo.DeviceTrace DT 
          JOIN dbo.PcbTrace  PT ON DT.CompId = '101125937' 
                               AND DT.DeviceID = PT.DeviceID 
          JOIN dbo.PanelBlockTrace PB ON PB.PcbID = PT.PcbID)

Можете ли вы исправить меня?

Ответы [ 6 ]

2 голосов
/ 26 апреля 2011

Я переписал ваш запрос как:

SELECT PT.PcbId
  FROM dbo.PcbTrace PT 
 WHERE EXISTS (SELECT NULL
                 FROM dbo.DeviceTrace DT 
                WHERE DT.DeviceID = PT.DeviceID 
                  AND DT.CompId = '101125937')
   AND NOT EXISTS (SELECT NULL
                     FROM dbo.PANELBLOCKTRACE pbt 
                    WHERE pbt.pcbid = PT.pcbid)

... потому что вы скопировали свое первое объединение в часть NOT IN, но нет никакой связи между PANELBLOCKTRACE и DEVICETRACE на основании предоставленной вами информации.

1 голос
/ 26 апреля 2011

проверить это:

select PT.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID
where PT.PcbId
not in 

(select PB.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID 
INNER Join dbo.PanelBlockTrace PB
on
PB.PcbID = PT.PcbID)
1 голос
/ 26 апреля 2011

Ваш запрос выглядит так, как будто вы хотите исключить те PcbID, которые в PanelBlockTrace соответствуют критериям фильтра CompID.

Попробуйте это:

select PT.PcbId
from dbo.DeviceTrace DT  
INNER Join dbo.PcbTrace  PT on DT.CompId = '101125937' 
                            and DT.DeviceID = PT.DeviceID
LEFT JOIN dbo.PanelBlockTrace PB ON PB.PcbID = PT.PcbID    
WHERE PB.PcbID IS NULL

Я бы предпочел это решение выше, чем WHERE PT.PcbId NOT IN, потому что для этого потребуется один удар по столу, а не 2, как для NOT IN.

1 голос
/ 26 апреля 2011

Вы должны указать имя поля, когда говорите «не в», например:


select PT.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID

<b>and [fieldName] not in</b> 

(select PB.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID 
INNER Join dbo.PanelBlockTrace PB
on
PB.PcbID = PT.PcbID)

Или, если вы хотите, чтобы оно было в отдельном предложении where, вам нужно:


select PT.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID

<b>where [fieldName] not in</b>

(select PB.PcbId
from dbo.DeviceTrace DT  INNER Join dbo.PcbTrace  PT 
on DT.CompId = '101125937' and DT.DeviceID = PT.DeviceID 
INNER Join dbo.PanelBlockTrace PB
on
PB.PcbID = PT.PcbID)

Хотя вам действительно следует использовать «левое соединение», а не «не в», что будет намного быстрее ..

0 голосов
/ 26 апреля 2011

Ваш запрос выглядит нормально.

Если что-то не так, пожалуйста, уточните.

Кроме того, этот запрос ниже эквивалентен вашему:

SELECT PT.PcbId
FROM dbo.DeviceTrace DT  
  JOIN dbo.PcbTrace  PT ON DT.CompId = '101125937' 
                       AND DT.DeviceID = PT.DeviceID

EXCEPT

SELECT PcbId
FROM dbo.PanelBlockTrace

Этоимеет более простую структуру и может помочь вам легче определить проблему.

0 голосов
/ 26 апреля 2011

Используйте EXCEPT вместо NOT IN, как:

SELECT query1

EXCEPT

SELECT query2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...