Вы можете использовать itertools.chain()
:
>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain(*list2d))
или, на Python> = 2.6, использовать itertools.chain.from_iterable()
, который не требуется распаковать список:
>>> import itertools
>>> list2d = [[1,2,3],[4,5,6], [7], [8,9]]
>>> merged = list(itertools.chain.from_iterable(list2d))
Этот подход, возможно, более читабельен, чем [item for sublist in l for item in sublist]
, и, похоже, работает быстрее:
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99;import itertools' 'list(itertools.chain.from_iterable(l))'
10000 loops, best of 3: 24.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 45.2 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 488 usec per loop
[me@home]$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 522 usec per loop
[me@home]$ python --version
Python 2.7.3
Я думаю, что у вас двусмысленность только в InvoiceID. Другие поля кажутся разными. Итак, попробуйте This
Я просто заменю InvoiceID на Invoices.InvoiceID
SELECT
VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount
FROM Vendors
JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID)
JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID)
WHERE
Invoices.InvoiceID IN
(SELECT InvoiceSequence
FROM InvoiceLineItems
WHERE InvoiceSequence > 1)
ORDER BY
VendorName, Invoices.InvoiceID, InvoiceSequence, InvoiceLineItemAmount
Вы можете использовать tablename.columnnae для всех столбцов (в выборе, где, по группам и по порядку) без используя любой псевдоним. Однако вы можете использовать псевдоним, руководствуясь другими ответами
, если вы присоединяетесь к двум или более таблицам, и у них есть похожие имена для своих столбцов, сервер sql хочет, чтобы вы квалифицировали столбцы, к которым они принадлежат.
SELECT ev.[ID]
,[Description]
FROM [Events] as ev
LEFT JOIN [Units] as un ON ev.UnitID = un.UnitId
, если таблицы Events и Units имеют одинаковое имя столбца (ID ) SQL-сервер хочет, чтобы вы использовали псевдонимы.
Скорее всего, обе таблицы имеют столбец с тем же именем. Псевдоним каждой таблицы и вызовите каждый столбец с псевдонимом таблицы.
У вас есть столбец InvoiceID
в таблице Invoices
, а также в таблице InvoiceLineItems
. Механизм выполнения запроса не знает, какой из них вы хотите вернуть.
Добавление псевдонима таблицы поможет:
SELECT V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount
FROM Vendors V
JOIN Invoices I ON (...)
JOIN InvoiceLineItems IL ON (...)
WHERE ...
ORDER BY V.VendorName, I.InvoiceID, IL.InvoiceSequence, IL.InvoiceLineItemAmount
это потому, что некоторые из полей (в частности InvoiceID в таблице Invoices и в InvoiceLineItems ) присутствуют на обеих таблицах. Способ ответа на вопрос состоит в том, чтобы добавить к нему ALIAS
.
SELECT
a.VendorName, Invoices.InvoiceID, .. -- or use full tableName
FROM Vendors a -- This is an `ALIAS` of table Vendors
JOIN Invoices ON (Vendors.VendorID = Invoices.VendorID)
JOIN InvoiceLineItems ON (Invoices.InvoiceID = InvoiceLineItems.InvoiceID)
WHERE
Invoices.InvoiceID IN
(SELECT InvoiceSequence
FROM InvoiceLineItems
WHERE InvoiceSequence > 1)
ORDER BY
VendorName, InvoiceID, InvoiceSequence, InvoiceLineItemAmount
Поскольку вы соединяете две таблицы Invoices и InvoiceLineItems, которые содержат InvoiceID. измените на Invoices.InvoiceID, чтобы сделать его правильным.