Неоднозначное имя столбца Sqlite, которое не является двусмысленным, включает имя таблицы

У меня есть следующий оператор SELECT для sqlite, который возвращается с Error: ambiguous column name: msgs.msgcontent1, однако это имя столбца не двусмысленно! Может ли кто-нибудь помочь мне понять, что мне здесь не хватает?

SELECT 
  phone_lookup.normalized_number AS number , 
  contacts.display_name AS name , 
  msgs.msgcontent1 
FROM 
  contacts2.contacts , 
  temp.msgs 
  INNER JOIN contacts2.phone_lookup ON ( contacts.name_raw_contact_id = phone_lookup.raw_contact_id ) 
  INNER JOIN temp.msgs ON ( contacts.phone_lookup.normalized_number = msgs.sender ) ;

Следующий оператор is я использовал для создания таблицы, содержащей проблемный столбец:

CREATE TEMP TABLE msgs 
AS SELECT 
  PART."_ID" , 
  ADDR."_ID" , 
  DATETIME( SUBSTR( COALESCE( PDU."DATE" , SMS."DATE" ) , 1 , 10 ) , 'localtime' , 'unixepoch' ) AS dt , 
  COALESCE( PDU.READ , SMS.READ ) AS read , 
  COALESCE( SMS.ADDRESS , ADDR.ADDRESS ) AS sender , 
  COALESCE( SMS.BODY , COALESCE( PART.TEXT , PART."_DATA" ) ) AS msgcontent1 
FROM 
  mmssms.PDU 
  LEFT OUTER JOIN mmssms.SMS ON ( PDU."DATE" = SMS."DATE" ) 
  LEFT OUTER JOIN mmssms.PART ON ( PART.MID = PDU."_ID" ) 
  LEFT OUTER JOIN mmssms.ADDR ON ( ADDR.MSG_ID = PDU."_ID" ) 
WHERE 
  COALESCE( SMS.BODY , COALESCE( PART.TEXT , PART."_DATA" ) ) IS NOT NULL AND ADDR."_ID" IN 
    ( 
      SELECT 
        MIN( ADDR."_ID" ) 
      FROM 
        ADDR 
      GROUP BY 
        ADDR.MSG_ID 
      ORDER BY 
        ADDR."_ID" 
    ) AND PART."_ID" IN 
    ( 
      SELECT 
        MAX( PART."_ID" ) 
      FROM 
        mmssms.PART 
      GROUP BY 
        PART.MID 
      ORDER BY 
        PART."_ID" 
    ) 
UNION ALL 
SELECT 
  PART."_ID" , 
  ADDR."_ID" , 
  DATETIME( SUBSTR( COALESCE( PDU."DATE" , SMS."DATE" ) , 1 , 10 ) , 'localtime' , 'unixepoch' ) AS dt , 
  COALESCE( PDU."READ" , SMS."READ" ) AS read , 
  COALESCE( SMS."ADDRESS" , ADDR."ADDRESS" ) AS sender , 
  COALESCE( SMS."BODY" , COALESCE( PART."TEXT" , PART."_DATA" ) ) AS msgcontent2 
FROM 
  mmssms.SMS 
  LEFT OUTER JOIN mmssms.PDU ON ( PDU."DATE" = SMS."DATE" ) 
  LEFT OUTER JOIN mmssms.PART ON ( PART."MID" = PDU."_ID" ) 
  LEFT OUTER JOIN mmssms.ADDR ON ( ADDR."MSG_ID" = PDU."_ID" ) 
WHERE 
  COALESCE( SMS."BODY" , COALESCE( PART."TEXT" , PART."_DATA" ) ) IS NOT NULL 
ORDER BY 
  DATETIME( SUBSTR( COALESCE( PDU."DATE" , SMS."DATE" ) , 1 , 10 ) , 'localtime' , 'unixepoch' ) DESC , 
  ADDR."_ID" ASC ;

И, наконец, хотя я не считаю, что это имеет отношение к проблеме, я начинаю команды sqlite со следующей прагмы и операторов присоединения, чтобы убедиться, что у меня есть доступ ко всему:

PRAGMA temp_store = MEMORY ;
ATTACH '/data/data/com.android.providers.contacts/databases/contacts2.db' AS contacts2 ;
ATTACH '/data/data/com.android.providers.telephony/databases/mmssms.db' AS mmssms ;

person HeatherLeigh    schedule 15.09.2014    source источник


Ответы (1)


Похоже, что temp.msgs после FROM не требуется, так как это уже есть в предложении INNER JOIN. Итак, этот запрос должен работать:

SELECT 
  phone_lookup.normalized_number AS number , 
  contacts.display_name AS name , 
  msgs.msgcontent1 
FROM 
  contacts2.contacts
  INNER JOIN contacts2.phone_lookup ON ( contacts.name_raw_contact_id = phone_lookup.raw_contact_id ) 
  INNER JOIN temp.msgs ON ( contacts.phone_lookup.normalized_number = msgs.sender ) ;

Если вам нужно указать одну и ту же таблицу в двух местах (предложения FROM и JOIN), вы должны использовать разные псевдонимы для каждого и ссылаться на столбцы, используя эти псевдонимы.

Дополнительная информация: Язык запросов SQLite: SELECT

person Rimas    schedule 15.09.2014