неоднозначное имя столбца на sqlite [duplicate]

Вы можете использовать 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

23
задан jaielob 30 September 2012 в 17:37
поделиться

6 ответов

Я думаю, что у вас двусмысленность только в 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 для всех столбцов (в выборе, где, по группам и по порядку) без используя любой псевдоним. Однако вы можете использовать псевдоним, руководствуясь другими ответами

35
ответ дан Sami 25 August 2018 в 04:20
поделиться

, если вы присоединяетесь к двум или более таблицам, и у них есть похожие имена для своих столбцов, сервер sql хочет, чтобы вы квалифицировали столбцы, к которым они принадлежат.

SELECT  ev.[ID]
    ,[Description]
    FROM   [Events] as ev 
    LEFT JOIN  [Units] as un ON ev.UnitID = un.UnitId  

, если таблицы Events и Units имеют одинаковое имя столбца (ID ) SQL-сервер хочет, чтобы вы использовали псевдонимы.

1
ответ дан Ahmet Arslan 25 August 2018 в 04:20
поделиться

Скорее всего, обе таблицы имеют столбец с тем же именем. Псевдоним каждой таблицы и вызовите каждый столбец с псевдонимом таблицы.

4
ответ дан dotancohen 25 August 2018 в 04:20
поделиться

У вас есть столбец 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
7
ответ дан Graeme Perrow 25 August 2018 в 04:20
поделиться

это потому, что некоторые из полей (в частности 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
4
ответ дан John Woo 25 August 2018 в 04:20
поделиться

Поскольку вы соединяете две таблицы Invoices и InvoiceLineItems, которые содержат InvoiceID. измените на Invoices.InvoiceID, чтобы сделать его правильным.

5
ответ дан Uchiha_Sasuke 25 August 2018 в 04:20
поделиться
Другие вопросы по тегам:

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