0

「テーブル A」と「テーブル B」の 2 つのテーブルからデータを取得する必要があります。「テーブル A」と「テーブル B」の間には 1:M の関係があり、A.IDNumber が「テーブル B」の外部キーとして使用されます。

私がやりたいことは、テーブル A から値を 1 回抽出し、対応する値を「テーブル A」のデータを繰り返さずに「テーブル B」から抽出することです。

これを行うには、私のクエリはどのようになりますか? 参考までに、「テーブル A」から次の値が必要だとしましょう: A.IDNumber、A.Amount、および「テーブル B」の値から B.IDNumber、B.Address、B.State、B.City、B.State、 B.ジップ。

これについて助けてくれてありがとう!

4

3 に答える 3

1

以下のクエリを使用できます。これが実際のSQLフィドルです

SELECT CASE WHEN RN=1 THEN IDNumber END IDNumber,
       CASE WHEN RN=1 THEN Amount END Amount,
       Address, City, State, Zip
FROM
(
  SELECT A.IDNumber, A.Amount,
         B.Address, B.City, B.STATE, B.Zip,
         RN = Row_number() over (partition BY A.IDNumber
                               ORDER BY B.IDNumber)
  FROM tableA A
  LEFT JOIN tableB B ON A.IDNumber = B.IDNumber
) X
ORDER BY IDNumber, RN

この出力が得られます

ID番号 金額 住所 市区町村 州 郵便番号
1 200.1 1 公道ゴッサム AX 19281
(null) (null) Secret Batcave Gotham AX 19281
(null) (null) 海外の隠れ家 不特定?? なし
2 312.45 ジョン ウー レーン トレスパス TX 12345
(null) (null) 住所 都市 州 Sq-123

このサンプルテーブルが与えられたとき

CREATE TABLE TableA(
  IDNumber int, Amount money)
CREATE TABLE TableB(
  IDNumber int,
  Address varchar(max),
  City varchar(max),
  State varchar(max),
  Zip varchar(max))
INSERT TableA SELECT
  1,200.10 union all select
  2,312.45
INSERT TableB SELECT
  1, '1 Public Road', 'Gotham', 'AX', '19281' union all select
  1, 'Secret Batcave', 'Gotham', 'AX', '19281' union all select
  1, 'Overseas Hideaway', 'Unspecified', '??', 'n/a' union all select
  2, 'John Woo Lane', 'Trespass', 'TX', '12345' union all select
  2, 'Address', 'City', 'State', 'Sq-123'
于 2012-09-21T21:37:11.620 に答える
0

値を繰り返さないため、クエリで DISTINCT を使用します

select **DISTINCT** A.IDNumber, A.Amount, and from 'TableB' values B.IDNumber, B.Address, B.State, B.City, B.State, B.Zip from TableA A, TableB B where A.IDNumber = B.IDNumber
于 2012-09-21T21:26:33.833 に答える
0

あなたが言っているのは、B の結果の最初の行にのみテーブル A のフィールドが必要だということです。

これを行う方法は、データベースによって異なります。ほとんどのデータベースで機能するアプローチを次に示します。

with b as (
     select b.*,
            row_number() over (partition by b.a_idnumber order by b.idnumber) as seqnum
     from tableb
    )
select (case when b.seqnum = 1 then a.idnumber end) as IdNumber,
       (case when b.seqnum = 1 then a.amount end) as Amount,
       b.*
from tablea a join
     b
     on a.idnumber = b.a_idnumber
order by a.idnumber, b.seqnum
于 2012-09-21T21:27:54.427 に答える