db.Prepare (& ldquo; INSERT INTO? VALUES () & rdquo;) не работает [дубликат]

Простейшее обходное решение, использующее None

>>> def bar(b, data=None):
...     data = data or []
...     data.append(b)
...     return data
... 
>>> bar(3)
[3]
>>> bar(3)
[3]
>>> bar(3)
[3]
>>> bar(3, [34])
[34, 3]
>>> bar(3, [34])
[34, 3]
1
задан Dippi 4 October 2011 в 16:15
поделиться

2 ответа

Единственный способ, без динамического построения запросов, состоит в жестком коде в каждой комбинации и выборе того, который вы хотите.

Если имя таблицы является параметром для хранимой процедуры, это может быть в IF-блоках. Но это неудобно.

Если поля из каждой таблицы одинаковы, вы можете объединить таблицы вместе и выбрать из них ...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, * FROM Table1
UNION SELECT 'Table2' AS tableName, * FROM Table2
UNION SELECT 'Table3' AS tableName, * FROM Table3
-- etc

SELECT * FROM myUnifiedStructure WHERE tableName = 'Table1'

Если поля в каждой таблице различны, вас может интересовать только подмножество полей ...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, field1 AS field1, field4 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field2 AS field1, field3 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field2 AS field1, field4 AS field2 FROM Table3
-- etc

Или вы можете передать NULL для полей, которые не существуют в исходной таблице ...

CREATE VIEW myUnifiedStructure AS
      SELECT 'Table1' AS tableName, NULL   AS field1, field2 AS field2 FROM Table1
UNION SELECT 'Table2' AS tableName, field1 AS field1, field2 AS field2 FROM Table2
UNION SELECT 'Table3' AS tableName, field1 AS field1, NULL   AS field2 FROM Table3
-- etc
2
ответ дан MatBailie 22 August 2018 в 05:11
поделиться
  • 1
    +1. Побей меня ... – Josef K 4 October 2011 в 16:36
  • 2
    К сожалению, имена таблиц также динамичны, поэтому я не могу их жестко закодировать. НО, я знаю, когда и когда создается новая таблица (на самом деле я их создаю), поэтому каждый раз, когда я могу динамически отбрасывать и воссоздавать представление, которое будет делать UNION, вы предлагаете. Большой! Спасибо – Dippi 4 October 2011 в 16:38

Зачем вам нужны отдельные таблицы? Обычно это признак плохого дизайна. Не проще ли было бы создать единую таблицу с полем идентификатора для любого значения X`, к которому принадлежит запись, к которой вы можете присоединиться / фильтровать?

Это позволило бы уменьшить запрос до чего-то вроде

SELECT ...
FROM othertable
JOIN bigtable ON othertable.c_id = bigtable.c_id AND othertable.fieldName = bigtable.fieldName
2
ответ дан Marc B 22 August 2018 в 05:11
поделиться
  • 1
    да, я знаю, это первое, что я подумал, увидев это, но я не собираюсь обсуждать БД, и я знал, что рано или поздно этот дрянной дизайн даст мне проблему ... :( – Dippi 4 October 2011 в 16:07
Другие вопросы по тегам:

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