0

クエリを作成しようとしている 3 つのテーブルがあります:
テーブル 1 (iuieEmployee) -> ポジション番号
テーブル 2 (jbEmployeeH1BInfo) -> ポジション番号、LCA 番号、開始日
テーブル 3 (jbEmployeeLCA) -> LCA 番号
テーブル 4 (jbInternationsl) -> 主な人口統計表

各テーブルにレコードが 1 つしかない場合に正常に機能するクエリがありますが、テーブル 2 と 3 には複数のレコードを含めることができます。最新の開始日を持つレコードを検索し、3 番目のテーブルに一致する LCA 番号があり、最初のテーブルに一致する位置番号があることを確認し、そうでないレコードを表示するようにします。どうすればこれを達成できますか? 私は現在持っています:

SELECT DISTINCT jbInternational.idnumber, jbInternational.lastname, jbInternational.firstname, jbInternational.midname, 
            jbInternational.campus, jbInternational.universityid, jbInternational.sevisid, jbInternational.citizenship,
            jbInternational.immigrationstatus, jbEmployeeH1BInfo.lcaNumber AS lcaNumber1, jbEmployeeLCA.lcaNumber AS lcaNumber2

FROM (select jbEmployeeH1BInfo.idnumber, MAX(jbEmployeeH1BInfo.approvalStartDate) AS MaxDateStamp FROM [internationalservices].[dbo].jbEmployeeH1BInfo GROUP BY idnumber ) my
            INNER JOIN [internationalservices].[dbo].jbEmployeeH1BInfo WITH (nolock) ON my.idnumber=jbEmployeeH1BInfo.idnumber AND my.MaxDateStamp=jbEmployeeH1BInfo.approvalStartDate
            INNER JOIN [internationalservices].[dbo].jbInternational WITH (nolock) ON jbInternational.idnumber=jbEmployeeH1BInfo.idnumber 
            inner join [internationalservices].[dbo].jbEmployeeLCA ON jbInternational.idnumber = jbEmployeeLCA.idnumber

WHERE jbInternational.idnumber not in(

SELECT DISTINCT jbInternational.idnumber

FROM (select distinct jbEmployeeH1BInfo.idnumber, MAX(jbEmployeeH1BInfo.approvalStartDate) AS MaxDateStamp
            FROM [internationalservices].[dbo].jbEmployeeH1BInfo GROUP BY idnumber ) my
            INNER JOIN [internationalservices].[dbo].jbEmployeeH1BInfo WITH (nolock) ON my.idnumber=jbEmployeeH1BInfo.idnumber AND my.MaxDateStamp=jbEmployeeH1BInfo.approvalStartDate
            INNER JOIN [internationalservices].[dbo].jbInternational WITH (nolock) ON jbInternational.idnumber=jbEmployeeH1BInfo.idnumber 
            inner join [internationalservices].[dbo].jbEmployeeLCA ON jbInternational.idnumber = jbEmployeeLCA.idnumber
            AND jbEmployeeH1BInfo.lcaNumber = jbEmployeeLCA.lcaNumber)

テーブル スキーマ:

create table iuieEmployee(idnumber int, POS_NBR varchar(8));
insert into iuieEmployee values(123456, '470V13');
insert into iuieEmployee values(123457, '98X000');
insert into iuieEmployee values(123458, '98X000');
insert into iuieEmployee values(123455, '98X000');

create table jbEmployeeH1BInfo (idnumber int, approvalStartDate smalldatetime, lcaNumber varchar(20), positionNumber varchar(200));
insert into jbEmployeeH1BInfo values (123456, 07/01/2012, '1-200-3000', '98X000');
insert into jbEmployeeH1BInfo values (123456, 07/30/2013, '1-200-4000', '470V13');
insert into jbEmployeeH1BInfo values (123457, 07/01/2012, '1-200-5000', '98X000');
insert into jbEmployeeH1BInfo values (123458, 07/01/2012, '1-200-6000', '98X000');
insert into jbEmployeeH1BInfo values (123455, 07/30/2014, '1-200-7000', '98X000');
insert into jbEmployeeH1BInfo values (123455, 07/01/2012, '1-200-8000', '470V13');

create table jbEmployeeLCA (idnumber int, lcaNumber varchar(20));  
insert into jbEmployeeLCA values (123456, 1-200-3000);
insert into jbEmployeeLCA values (123456, 1-200-4111);
insert into jbEmployeeLCA values (123457, 1-200-5000);
insert into jbEmployeeLCA values (123458, 1-200-6000);
insert into jbEmployeeLCA values (123455, 1-200-7000);
insert into jbEmployeeLCA values (123455, 1-200-8000);

create table jbInternational(idnumber int);
insert into jbInternational values(123456);
insert into jbInternational values(123457);
insert into jbInternational values(123458);
insert into jbInternational values(123455);

1 行のみを返す必要があります:
123456, 07/30/2013, '1-200-4000'

が、代わりに 2 行を返しています:
123456, 07/30/2013, '1-200-4000 (1-200-4111 と一致しません) )
123456, 07/30/2013, '1-200-4000 (1-200-3000 と一致しません)
-3000 lca 番号の位置番号には最新の日付がないため、2 行目を返す必要はありません.

4

1 に答える 1

0

あなたの説明はわかりにくいです。うまく説明できれば、おそらく自分でクエリを作成できると思います。これがあなたが意味したと思うことです:

Employee には主なレコードが含まれています。

次のようなすべての idnumber を見つけたいとします。

  • ID番号はインターナショナルです
  • 最新の approvalStartDate を持つ H1BInfo レコードに、LCA レコードと一致する LCA 番号がない

最初に行うことは、その H1BInfo テーブルを単純化することです。最新の approvalStartDate を持つ行のみを探しています。これは、idnumber で分割し、approvalStartDate で並べ替えることで実現できます。

with rankedH1BInfo as (
    SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY jbEmployeeH1BInfo.idnumber
            ORDER BY jbEmployeeH1BInfo.approvalStartDate desc) as r 
    FROM [internationalservices].[dbo].jbEmployeeH1BInfo
)

各パーティションの最初の行だけを取得しましょう:

, MostRecentH1BInfo as (
    SELECT * FROM rankedH1BInfo
    WHERE r = 1
)

これで、結合を実行して、すべての適切なものを見つけることができます。

, goodIDs as (
    SELECT i.idnumber
    FROM [internationalservices].[dbo].jbInternational i WITH (NOLOCK)
    JOIN [internationalservices].[dbo].jbEmployeeLCA l WITH (NOLOCK) on l.idnumber = i.idnumber
    JOIN MostRecentH1BInfo h WITH (NOLOCK) on h.idnumber = i.idnumber
    JOIN iuieEmployee e WITH (NOLOCK) on e.positionNumber = h.positionNumber
    WHERE h.lcaNumber = l.lcaNumber
)

すべてをまとめて、これが false のものを取得するには:

with rankedH1BInfo as (
    SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY jbEmployeeH1BInfo.idnumber
            ORDER BY jbEmployeeH1BInfo.approvalStartDate desc) as r 
    FROM [internationalservices].[dbo].jbEmployeeH1BInfo
), MostRecentH1BInfo as (
    SELECT * FROM rankedH1BInfo
    WHERE r = 1
), goodIDs as (
    SELECT i.idnumber
    FROM [internationalservices].[dbo].jbInternational i WITH (NOLOCK)
    JOIN [internationalservices].[dbo].jbEmployeeLCA l WITH (NOLOCK) on l.idnumber = i.idnumber
    JOIN MostRecentH1BInfo h WITH (NOLOCK) on h.idnumber = i.idnumber
    JOIN iuieEmployee e WITH (NOLOCK) on e.positionNumber = h.positionNumber
    WHERE h.lcaNumber = l.lcaNumber
)
SELECT DISTINCT jbInternational.idnumber, jbInternational.lastname, jbInternational.firstname, jbInternational.midname, 
        jbInternational.campus, jbInternational.universityid, jbInternational.sevisid, jbInternational.citizenship,
        jbInternational.immigrationstatus, jbEmployeeH1BInfo.lcaNumber AS lcaNumber1, jbEmployeeLCA.lcaNumber AS lcaNumber2
FROM (select jbEmployeeH1BInfo.idnumber, MAX(jbEmployeeH1BInfo.approvalStartDate) AS MaxDateStamp FROM [internationalservices].[dbo].jbEmployeeH1BInfo GROUP BY idnumber ) my
            INNER JOIN [internationalservices].[dbo].jbEmployeeH1BInfo WITH (nolock) ON my.idnumber=jbEmployeeH1BInfo.idnumber AND my.MaxDateStamp=jbEmployeeH1BInfo.approvalStartDate
            INNER JOIN [internationalservices].[dbo].jbInternational WITH (nolock) ON jbInternational.idnumber=jbEmployeeH1BInfo.idnumber 
            inner join [internationalservices].[dbo].jbEmployeeLCA ON jbInternational.idnumber = jbEmployeeLCA.idnumber
WHERE jbInternational.idnumber not in (select idnumber from goodIDs)
于 2013-07-29T17:59:44.487 に答える