title: SQLAlchemy: Unnecessary join with joinedload
body: <p>I'm using SQLAlchemy ORM for a Flask project where I want to join across an eagerly loaded model but this leads to two joins to the same intermediary model. If you run the code below you'll see in the generated SQL that there are two joins between the Author model and the Book model. If the <code>lazy=joined</code> bit is removed the sql generated is perfect.</p>
  
  <p>I don't know if I'm doing something wrong or this is by design. How do I get SQLAlchemy to emit the right SQL while maintaining the joinedload in this case?</p>
  
  <p>Note: I have tried this with MySQL and SQLite and it happens with both those dbs.</p>
  
  <pre><code>from sqlalchemy import create_engine, Integer, String, Column
  from sqlalchemy.orm import sessionmaker
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy import ForeignKey
  from sqlalchemy.orm import relationship
  
  engine = create_engine('sqlite:///:memory:', echo=True)
  Session = sessionmaker(bind=engine)
  Base = declarative_base()
  
  from sqlalchemy import create_engine, Integer, String, Column
  from sqlalchemy.orm import sessionmaker
  from sqlalchemy.ext.declarative import declarative_base
  from sqlalchemy import ForeignKey
  from sqlalchemy.orm import relationship
  
  engine = create_engine('sqlite:///:memory:', echo=True)
  Session = sessionmaker(bind=engine)
  Base = declarative_base()
  
  
  class Author(Base):
      __tablename__ = 'authors'
      id = Column(Integer, primary_key=True)
      name = Column(String)
      pseudo = Column(String)
      books = relationship("Book", lazy='joined')
  
      def __repr__(self):
          return "&lt;User(name='%s', fullname='%s', password='%s')&gt;" % (
              self.name, self.fullname, self.password)
  
  
  class Book(Base):
      __tablename__ = 'books'
      id = Column(Integer, primary_key=True)
      author_id = Column(Integer, ForeignKey('authors.id'))
      name = Column(String)
      user = relationship("Author", back_populates="books")
      pages = relationship("Page")
  
  
  class Page(Base):
      __tablename__ = 'pages'
      id = Column(Integer, primary_key=True)
      book_id = Column(Integer, ForeignKey('books.id'))
      text = Column(String)
      book = relationship("Book", back_populates="pages")
  
  
  Base.metadata.create_all(engine)
  session = Session()
  
  print(str(session.query(Author).outerjoin(Author.books, Page)))
  </code></pre>