SQLite-다른 데이터베이스의 테이블을 어떻게 조인합니까?


100

SQLite 데이터베이스를 사용하는 응용 프로그램이 있으며 모든 것이 정상적으로 작동합니다. 이제 두 번째 SQLite 데이터베이스가 필요한 새로운 기능을 추가하는 과정에 있지만 다른 데이터베이스의 테이블을 조인하는 방법을 파악하는 데 어려움을 겪고 있습니다.

누군가가 이걸로 나를 도울 수 있다면 정말 감사하겠습니다!

편집 : 수락 된 답변에 언급 된대로 데이터베이스를 연결할 때 언어에 적응할 수있는 예제 사례는 이 질문 을 참조하십시오 .


데이터베이스는 어떤가요? 결합하는 데 사용할 수있는 공통 열이 있습니까? 유니온을 사용할 수 있도록 각 열이 동일합니까? sqlite.org/syntaxdiagrams.html
Alex R.

예, 이름이 같기 때문에 USING 키워드를 사용하여 조인 할 수있는 열이 있습니다. 내 문제는 내 프로그램이 이미 동일한 데이터베이스의 테이블에서이 작업을 자주 수행하기 때문에 조인하는 방법을 모른다는 것이 아니라 두 데이터베이스를 연결하는 방법을 찾을 수 없어서 하나의 데이터를 다른 데이터베이스에서 사용할 수 있다는 것입니다 ( 같은)은 예를 들어, 가입
아담 스미스 (Adam Smith)

예 : 첫 번째 데이터베이스에는 "schedule"이라는 테이블이 있으며 다른 열 중에서 날짜 열, 팀 ID 및 레인 번호가 포함되어 있습니다. 두 번째 데이터베이스에는 사용자가 팀 경기를 위해 입력 한 점수를 추적하는 테이블이 있습니다. 따라서이 테이블에는 날짜와 팀 ID도 있습니다. 각 팀이 어떤 레인에서 플레이해야하는지 알기 위해이 두 열을 사용하여 그들과 합류하고 싶습니다. 다른 목적으로 조인해야하는 다른 테이블이 있지만이 예제에서 필요한 내용을 알 수 있습니다.
Adam Smith

답변:


126

Sqlite 빌드에서 ATTACH활성화 된 경우 ( 대부분의 빌드에 있어야 함 ) ATTACH 키워드를 사용하여 현재 연결에 다른 데이터베이스 파일을 연결할 수 있습니다 . 부착 할 수 데시벨의의의 수에 제한은 컴파일 시간 설정 (이다 SQLITE_MAX_ATTACHED ), 10 현재 기본값으로, 그러나 이것은 너무 당신이 빌드에 따라 다를 수 있습니다. 글로벌 제한은 125입니다.

attach 'database1.db' as db1;
attach 'database2.db' as db2;

키워드로 연결된 모든 데이터베이스를 볼 수 있습니다.

.databases

그러면 다음을 수행 할 수 있습니다.

select
  *
from
  db1.SomeTable a
    inner join 
  db2.SomeTable b on b.SomeColumn = a.SomeColumn;

참고 "[t] 그가 데이터베이스 이름 그 maintemp임시 테이블 및 기타 임시 데이터 오브젝트를 보유 할 기본 데이터베이스 및 데이터베이스 위해 예약되어 있습니다. 이러한 데이터베이스 이름 모두가 모든 데이터베이스 연결을 위해 존재하고 첨부 파일에 사용되어서는 안된다."


2
사용자 StanleyD는 '파일 이름 주위 에 (작은 따옴표) 를 넣을 때까지 작동하지 않는다고 언급했습니다 . 나는 똑같은 것을 찾았다.
bkribbs

4

이 질문을 완료하는 C # 예제는 다음과 같습니다.

/// <summary>
/// attachSQL = attach 'C:\\WOI\\Daily SQL\\Attak.sqlite' as db1 */
/// path = "Path of the sqlite database file
/// sqlQuery  = @"Select A.SNo,A.MsgDate,A.ErrName,B.SNo as BSNo,B.Err as ErrAtB from Table1 as A 
///                    inner join db1.Labamba as B on 
///                    A.ErrName = B.Err";
/// </summary>
/// <param name="attachSQL"></param>
/// <param name="sqlQuery"></param>
public static DataTable GetDataTableFrom2DBFiles(string attachSQL, string sqlQuery)
{
    try
    {
        string conArtistName = "data source=" + path + ";";
        using (SQLiteConnection singleConnectionFor2DBFiles = new SQLiteConnection(conArtistName))
        {
            singleConnectionFor2DBFiles.Open();
            using (SQLiteCommand AttachCommand = new SQLiteCommand(attachSQL, singleConnectionFor2DBFiles))
            {
                AttachCommand.ExecuteNonQuery();
                using (SQLiteCommand SelectQueryCommand = new SQLiteCommand(sqlQuery, singleConnectionFor2DBFiles))
                {
                    using (DataTable dt = new DataTable())
                    {
                        using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(SelectQueryCommand))
                        {
                            adapter.AcceptChangesDuringFill = true;
                            adapter.Fill(dt);
                            return dt;
                        }
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Use Process Exception method An error occurred");
        return null;
    }

}

1

글쎄, 나는 SQLite에 대한 경험이 많지 않으므로 단일 쿼리로 두 데이터베이스에 액세스해야합니다.

다음과 같은 것을 가질 수 있습니다.

select name from DB1.table1 as a join DB2.table2 as b where a.age = b.age;

SQLServer와 같은 데이터베이스에서는 이러한 계층 적 방식으로 다른 데이터베이스에 액세스 할 수 있으며 SQLite에서도 작동합니다.

1 개 이상의 데이터베이스로 sqlite 인스턴스를 시작할 수 있다고 생각합니다!


예, SQL 서버에 대한 설명서를 보았지만 SQLite에 해당하는 쿼리를 찾을 수 없습니다. 이 쿼리의 문제는 드라이버 관리자를 사용하여 연결을 생성하므로 데이터베이스 파일을 가리키는 두 개의 연결 개체가 있지만 conn1.table을 수행하는 것이 어떤 이유로 작동하지 않는 것 같습니다.
Adam Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.