2016-03-26 19 views
1

Python'daki SQLite veritabanımı, sonucu bir Pandas DataFrame olarak döndürme umuduyla sorgulamaya çalışıyorum. Ancak, sorguda çok fazla kayıt ile hatalı bir çıkışa neden olan bir şeyler yanlış gidiyor. Bu sorgu metni kullanmak Örneğin,:NATURAL JOIN ile sqlite sorgusu fazladan kayıtlar üretir

query = "SELECT name, season, opponent, ratingA, ratingB 
    FROM players NATURAL JOIN games NATURAL JOIN A_ratings NATURAL JOIN B_ratings 
    WHERE (season="2015-16") AND (home_away="home") AND (tournament="tournX") AND (name="John Doe")" 

doğru sonuç iki satır, bu koşullar ile bu oyuncu tarafından her görünüm için biri olmalıdır. Eğer bir imleç doğru sonucu yazdırmak olsaydı, bu şekilde görünecektir:

(u'John Doe', u'2015-16', u'TeamAlpha', 7.5, 8.0) 
(u'John Doe', u'2015-16', u'TeamBeta', 6.0, 6.0) 

yerine , ben adıyla koşullarla eşleşen oyunlar için takımdaki her oyuncu için derecelendirme olsun böyle name sütununda doğru adı yerine sorgudan:

(u'John Doe', u'2015-16', u'TeamAlpha', 7.5, 8.0) 
(u'John Doe', u'2015-16', u'TeamAlpha', 8.5, 9.0) 
(u'John Doe', u'2015-16', u'TeamAlpha', 6.5, 7.0) 
(u'John Doe', u'2015-16', u'TeamAlpha', 6.5, 6.0) 
(u'John Doe', u'2015-16', u'TeamAlpha', 7.0, 7.0)) 
(u'John Doe', u'2015-16', u'TeamBeta', 6.0, 6.0) 
(u'John Doe', u'2015-16', u'TeamBeta', 8.0, 7.5) 
(u'John Doe', u'2015-16', u'TeamBeta', 7.0, 7.0) 
(u'John Doe', u'2015-16', u'TeamBeta', 7.5, 8.0) 
(u'John Doe', u'2015-16', u'TeamBeta', 6.5, 7.0) 

Bu tablolar arasında oluyor çarpma çeşit var gibi görünüyor ve ben sorun DOĞAL içindedir bölümünü JOIN düşünüyorum ama Nasıl tamir edeceğimi bilemiyorum.

Açıkçası bir SQL acemi oldum ama SQLite için DB Browser'ma girdiğimde sorgu mükemmel bir şekilde çalıştığı için çok şaşırdım. İşte

CREATE TABLE "games" (
`gameID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
`season` TEXT, 
`tournament` TEXT, 
`home_away` TEXT, 
`opponent` TEXT, ) 

CREATE TABLE "players" (
`playerID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
`name` TEXT UNIQUE) 

CREATE TABLE "A_ratings" (
`A_ratingID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
`playerID` INTEGER, 
`gameID` INTEGER, 
`ratingA` REAL, 
FOREIGN KEY(`playerID`) REFERENCES `players`(`playerID`), 
FOREIGN KEY(`gameID`) REFERENCES games(gameID)) 

CREATE TABLE "B_ratings" (
`B_ratingID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
`playerID` INTEGER, 
`gameID` INTEGER, 
`ratingB` REAL, 
FOREIGN KEY(`playerID`) REFERENCES `players`(`playerID`), 
FOREIGN KEY(`gameID`) REFERENCES games(gameID)) 

ilgili panda parçası olmakla birlikte, (yukarıdaki gibi) Ben sadece imleç sonuçlarını yazdırırken sorun bile olmuyor:

tablolar böyle yapılandırılmıştır.

cnxn = sqlite3.connect(path) 
df = pd.read_sql(query, cnxn) 

cevap

2

Doğal birleşmelerden uzak durmayı ve üzerinde katılmak istediğiniz sütunlara açıkça katılmanızı öneririm. Tahmin etmeyi işler. Özellikle böyle bir durumda, açık bir anlaşma değil. Doğrudan ilişkili olmayan tablolar (oynatıcılar ve oyunlar) vardır, bu nedenle bu iki tablo arasında derecelendirme tablolarını içermeyen doğal bir katılım yoktur. Bu birleşmeler yapıldıktan sonra, orada bir çapraz birleştirmeyle (çoğaltma) sonuçlanabilir. Komplikasyona birazcık ek olarak, hem A_rating hem de B_rating'in hem oyunlara hem de oyunculara kendi katılımları vardır.

: verilerinizin daha görmeden

, bir nevi doğal itibaren bir durumda istenen sonuçlar alıyoruz, böyle bir deneyin şey verirdim birleşimler gerçeğine dayanarak tahmin ediyorum

query = """SELECT 
       name, season, opponent, ratingA, ratingB 
      FROM players 
       inner join A_ratings on 
       players.playerID = A_ratings.playerID 
       inner join B_ratings on 
       A_ratings.playerID = B_ratings.playerID and A_ratings.gameID = B_ratings.gameID 
       inner join games on 
        B_ratings.gameID = games.gameID 
      WHERE (season='2015-16') AND 
       (home_away='home') AND 
       (tournament='tournX') AND 
       (name='John Doe')""" 
+0

Katkılar KULLANIM kullanarak yazmak daha kolay olurdu. –

+0

Bir ton teşekkürler. Katılanların düzeninin önemi hakkında hiçbir fikrim yoktu; Bence bu yüzden benim denediğim çözümlerim başarısız oldu. – jdep