0

例:

SELECT fbs_household_id,fbh_file_no, fbc_last_name,fbc_first_name
    FROM fbs_household
        LEFT JOIN (SELECT fbc_household_id, fbc_last_name,fbc_first_name FROM fbs_client WHERE fbc_household_id=fbs_household_id ORDER BY fbc_dob ASC LIMIT 1) t1 ON 1;

fbs_household_idテーブルからのものですがfbs_household、不明なフィールドというエラーが表示されます。

クエリを次のように書き直すことができます。

SELECT fbs_household_id,fbh_file_no, fbc_last_name,fbc_first_name
    FROM fbs_household
        LEFT JOIN fbs_client ON fbs_client_id=(SELECT fbs_client_id
            FROM fbs_client
            WHERE fbc_household_id=fbs_household_id ORDER BY fbc_dob ASC LIMIT 1)

しかし、これは非常に遅いです。速度を上げる方法はありますか?

各世帯の最年長メンバーと、その世帯に関するその他の情報を取得しようとしています (実際のクエリには、さらにいくつかの列と結合が含まれています)。


3番目の解決策も遅い:

SELECT fbs_household_id,fbh_file_no, fbc_last_name,fbc_first_name
    FROM fbs_household
    LEFT JOIN (SELECT fbc_household_id, fbc_last_name,fbc_first_name
        FROM fbs_client
        ORDER BY fbc_dob ASC) c1 ON fbc_household_id=fbs_household_id;
4

2 に答える 2

1

これが機能するかどうかはわかりませんが、サブクエリを試行しmax(fbc_dob)て各世帯を取得し、テーブルに再度参加して他の値を取得しましたか?

SELECT h.fbs_household_id, h.fbh_file_no, c1.fbc_last_name, c1.fbc_first_name
FROM fbs_household h
LEFT JOIN fbs_client c1
  ON h.fbs_household_id = c1.fbc_household_id
LEFT JOIN
(
    select max(fbc_dob) fbc_dob, fbc_household_id  --- this will get you the oldest per household
    from fbs_client
    group by fbc_household_id
) c2
    ON c1.fbc_household_id = c2.fbc_household_id
    AND c1.fbc_dob = c2.fbc_dob

* select の正しいフィールドにエイリアスを配置したかどうかわかりません。

于 2012-11-20T19:23:47.207 に答える
1

顧客テーブルの各行を同じ世帯の年長者の行に自己結合し、そのような年長者が見つからない人を選択することで、各世帯の最も古い顧客を見つけるこの方法を試してください。

SELECT fbs_household_id, fbh_file_no, c1.fbc_last_name, c1.fbc_first_name
FROM fbs_household
LEFT JOIN fbs_client c1 
ON c1.fbc_household_id = fbs_household_id 
LEFT JOIN fbs_client c2
ON c1.household_id = c2.household_id
AND (c1.dob > c2.dob
     OR c1.dob = c2.dob 
     AND c1.fbs_client_id > c2.fbs_client_id) -- if same dob, choose lower id
WHERE c2.dob IS NULL
于 2012-11-20T20:10:30.033 に答える