メモ

```sql
INSERT INTO TABLE_B (ID, Name, item01_id, item01_name, item02_id, item02_name, item03_id, item03_name, item04_id, item04_name, item05_id, item05_name, item06_id, item06_name)
SELECT 
    ID,
    Name,
    item01_id,
    item01_name,
    item02_id,
    item02_name,
    item03_id,
    item03_name,
    COALESCE(NULLIF(item04_id, ''), item03_id) AS item04_id,
    COALESCE(NULLIF(item04_name, ''), item03_name) AS item04_name,
    COALESCE(NULLIF(item05_id, ''), item04_id) AS item05_id,
    COALESCE(NULLIF(item05_name, ''), item04_name) AS item05_name,
    COALESCE(NULLIF(item06_id, ''), item05_id) AS item06_id,
    COALESCE(NULLIF(item06_name, ''), item05_name) AS item06_name
FROM 
    (
        SELECT 
            ID,
            Name,
            item01_id,
            item01_name,
            item02_id,
            item02_name,
            item03_id,
            item03_name,
            item04_id,
            item04_name,
            item05_id,
            item05_name,
            item06_id,
            item06_name
        FROM 
            TABLE_A
    ) AS subquery;
```
テーブルAからBを作成する
```java

import java.sql.*;

public class Main {
    public static void main(String[] args) {
        try {
            // SQLite JDBCドライバをロード
            Class.forName("org.sqlite.JDBC");

            // SQLiteデータベースに接続
            Connection connection = DriverManager.getConnection("jdbc:sqlite:/path/to/your/database.db");

            // テーブルAからカラム名を取得するSQLクエリ
            DatabaseMetaData metaData = connection.getMetaData();
            ResultSet columns = metaData.getColumns(null, null, "TableA", null);

            StringBuilder createTableQuery = new StringBuilder("CREATE TABLE IF NOT EXISTS TableB (");

            // テーブルAのカラム名を使用してテーブルBを作成
            while (columns.next()) {
                String columnName = columns.getString("COLUMN_NAME");
                String columnType = columns.getString("TYPE_NAME");
                createTableQuery.append(columnName).append(" ").append(columnType).append(", ");
            }

            // 最後のカンマを削除してクエリを終了
            createTableQuery.setLength(createTableQuery.length() - 2);
            createTableQuery.append(")");

            // テーブルBを作成
            Statement statement = connection.createStatement();
            statement.executeUpdate(createTableQuery.toString());

            // テーブルAからデータを取得して判定処理とデータ挿入を行う部分は省略

            // 接続をクローズ
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

```

```java
import java.sql.*;

public class Main {
    public static void main(String[] args) {
        try {
            // SQLite JDBCドライバをロード
            Class.forName("org.sqlite.JDBC");

            // SQLiteデータベースに接続
            Connection connection = DriverManager.getConnection("jdbc:sqlite:/path/to/your/database.db");

            // テーブルAからデータを取得するSQLクエリ
            String selectQuery = "SELECT * FROM TableA";

            // SQLクエリを実行し結果を取得
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery(selectQuery);

            // テーブルBを作成
            DatabaseMetaData metaData = connection.getMetaData();
            ResultSet columnsA = metaData.getColumns(null, null, "TableA", null);
            ResultSet columnsC = metaData.getColumns(null, null, "TableC", null);
            StringBuilder createTableQuery = new StringBuilder("CREATE TABLE IF NOT EXISTS TableB (");

            // テーブルAのカラム名を使用してテーブルBを作成
            while (columnsA.next()) {
                String columnName = columnsA.getString("COLUMN_NAME");
                if (!hasColumn(columnsC, columnName)) { // カラム名がCテーブルに存在しないかチェック
                    String columnType = columnsA.getString("TYPE_NAME");
                    createTableQuery.append(columnName).append(" ").append(columnType).append(", ");
                }
            }
            createTableQuery.setLength(createTableQuery.length() - 2);
            createTableQuery.append(")");
            statement.executeUpdate(createTableQuery.toString());

            // テーブルAから取得したデータをテーブルBに挿入
            while (resultSet.next()) {
                StringBuilder insertQuery = new StringBuilder("INSERT INTO TableB (");
                ResultSetMetaData rsmd = resultSet.getMetaData();
                int columnCount = rsmd.getColumnCount();
                for (int i = 1; i <= columnCount; i++) {
                    String columnName = rsmd.getColumnName(i);
                    if (!hasColumn(columnsC, columnName)) { // カラム名がCテーブルに存在しないかチェック
                        insertQuery.append(columnName).append(", ");
                    }
                }
                insertQuery.setLength(insertQuery.length() - 2);
                insertQuery.append(") VALUES (");
                for (int i = 1; i <= columnCount; i++) {
                    String columnName = rsmd.getColumnName(i);
                    if (!hasColumn(columnsC, columnName)) { // カラム名がCテーブルに存在しないかチェック
                        insertQuery.append("?, ");
                    }
                }
                insertQuery.setLength(insertQuery.length() - 2);
                insertQuery.append(")");

                PreparedStatement preparedStatement = connection.prepareStatement(insertQuery.toString());
                for (int i = 1, j = 1; i <= columnCount; i++) {
                    String columnName = rsmd.getColumnName(i);
                    if (!hasColumn(columnsC, columnName)) { // カラム名がCテーブルに存在しないかチェック
                        preparedStatement.setObject(j++, resultSet.getObject(i));
                    }
                }
                preparedStatement.executeUpdate();
                preparedStatement.close();
            }

            // 接続をクローズ
            resultSet.close();
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 指定されたResultSetから指定されたカラム名のカラムが存在するかどうかを返すヘルパーメソッド
    private static boolean hasColumn(ResultSet resultSet, String columnName) throws SQLException {
        while (resultSet.next()) {
            if (resultSet.getString("COLUMN_NAME").equals(columnName)) {
                return true;
            }
        }
        return false;
    }
}