Во-первых, существует семантическая разница. Когда у вас есть соединение, вы говорите, что связь между этими двумя таблицами определяется этим условием. Итак, в первом примере вы говорите, что таблицы связаны с cd.Company = table2.Name AND table2.Id IN (2728)
. Когда вы используете предложение WHERE, вы говорите, что отношение определено cd.Company = table2.Name
и что вам нужны только строки, в которых применяется условие table2.Id IN (2728)
. Даже если они дают один и тот же ответ, это означает, что программист читает ваш код.
В этом случае предложение WHERE почти наверняка означает то, что вы имеете в виду, поэтому вы должны его использовать.
Во-вторых, на самом деле разница в результате в том случае, если вы используете LEFT JOIN вместо INNER JOIN. Если вы включите второе условие как часть соединения, вы все равно получите строку результатов, если условие не выполнено - вы получите значения из левой таблицы и значения null для правой таблицы. Если вы включаете условие как часть предложения WHERE и это условие терпит неудачу, вы не получите строку вообще.
Вот пример, чтобы продемонстрировать это.
Запрос 1 (ГДЕ):
SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
WHERE table2.Id IN (2728);
Результат:
field1
200
Запрос 2 (AND):
SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
AND table2.Id IN (2728);
Результат:
field1
100
200
Используемые тестовые данные:
CREATE TABLE table1 (Company NVARCHAR(100) NOT NULL, Field1 INT NOT NULL);
INSERT INTO table1 (Company, Field1) VALUES
('FooSoft', 100),
('BarSoft', 200);
CREATE TABLE table2 (Id INT NOT NULL, Name NVARCHAR(100) NOT NULL);
INSERT INTO table2 (Id, Name) VALUES
(2727, 'FooSoft'),
(2728, 'BarSoft');
Глюк для знания при использовании .get()
:
, Если словарь содержит ключ, привыкший в вызове к .get()
и его значение, None
, .get()
, метод возвратится None
, даже если значение по умолчанию будет предоставлено.
, Например, следующие возвраты None
, не 'alt_value'
, как может ожидаться:
d = {'key': None}
d.get('key', 'alt_value')
118-секундное значение только возвращено, если предоставленный ключ НЕ находится в словаре, не, если возвращаемое значение того вызова None
.