Почему dict.get (ключ) вместо dict [ключ]?

Во-первых, существует семантическая разница. Когда у вас есть соединение, вы говорите, что связь между этими двумя таблицами определяется этим условием. Итак, в первом примере вы говорите, что таблицы связаны с 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');
503
задан Bhargav Rao 22 June 2016 в 12:49
поделиться

1 ответ

Глюк для знания при использовании .get():

, Если словарь содержит ключ, привыкший в вызове к .get() и его значение, None, .get(), метод возвратится None, даже если значение по умолчанию будет предоставлено.

, Например, следующие возвраты None, не 'alt_value', как может ожидаться:

d = {'key': None}
d.get('key', 'alt_value')

118-секундное значение только возвращено, если предоставленный ключ НЕ находится в словаре, не, если возвращаемое значение того вызова None.

1
ответ дан 22 November 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: