Pyodbc SQL SELECT Cursor.execute дублирует результаты

 Records = Cursor.execute("SELECT cust_addr1, cust_addr2, cust_postcode, cust_telno_home, cust_email \
                           FROM tblcustomer, tblpet \
                           WHERE cust_surname = ? and tblpet.pet_deceased = ?" ,(SearchCriteria[0], "Y")).fetchall()

Я могу запустить этот запрос, если я полностью удалю tblpet, но когда я добавлю tblpet, запрос запустится, но я получу дублированные результаты. Таким образом, вместо 5 результатов у меня было что-то вроде 6300, но все те же результаты зацикливались.

Спасибо

ИЗМЕНИТЬ

Теперь я исправил это благодаря Mureinik и Siyual за то, что они рассказали мне о объединениях. потом нашел эти

https://msdn.microsoft.com/en-us/library/bb243855(v=office.12).aspx

СОЕДИНЕНИЕ таблиц mdb с помощью pyodbc

Это сработало на 50%, но тогда у меня появилась отличная идея войти в доступ и сделать запрос, а затем переключиться на представление SQL и скопировать его. Это прекрасно работает, и я был так близок

ОТВЕТ

 Records = Cursor.execute("""SELECT tblcustomer.cust_addr1, tblcustomer.cust_addr2,
                             tblcustomer.cust_postcode, tblcustomer.cust_telno_home, tblcustomer.cust_email
                             FROM tblcustomer INNER JOIN tblpet ON (tblcustomer.cust_no = tblpet.pet_cust_no)
                             WHERE cust_surname = ? and tblpet.pet_deceased = ?""", (SearchCriteria[0],"Y")).fetchall()

person Joshua Nixon    schedule 27.10.2016    source источник
comment
Потому что это делает CROSS JOIN. Если вы собираетесь использовать JOIN таблицы, используйте явный синтаксис JOIN (не используйте запятые в предложении FROMсерьёзно, это было объявлено устаревшим в 1992 году) и показать, как таблицы связаны в предложении ON.   -  person Siyual    schedule 27.10.2016
comment
спасибо - вопрос обновлен   -  person Joshua Nixon    schedule 27.10.2016


Ответы (1)


Когда вы пишете неявное соединение, как вы сделали здесь (т. е. имеете более одной таблицы в предложении from), база данных создает декартово произведение строк. Вам нужно добавить условие для соответствия только соответствующим строкам. Например, если предположить, что у клиента есть идентификатор, а у домашнего животного есть идентификатор клиента:

SELECT cust_addr1, cust_addr2, cust_postcode, cust_telno_home, cust_email
FROM   tblcustomer, tblpet
WHERE  tblcustomer.id = tblpet.customer_id AND -- Here!
       cust_surname = ? AND
       tblpet.pet_deceased = ?

Или, что еще лучше, вы можете использовать явный синтаксис join:

SELECT cust_addr1, cust_addr2, cust_postcode, cust_telno_home, cust_email
FROM   tblcustomer
JOIN   tblpet ON tblcustomer.id = tblpet.customer_id -- Here!
WHERE  cust_surname = ? AND
       tblpet.pet_deceased = ?
person Mureinik    schedule 27.10.2016