0

我有两个表需要从“表 A”和“表 B”中提取数据。“Table A”和“Table B”之间存在 1:M 关系,其中 A.IDNumber 作为“Table B”中的外键。

我想要做的是从表 A 中提取一次值,并从“表 B”中提取相应的值,而不重复“表 A”数据。

我的查询会是什么样子?为了提供帮助,假设我想要“表 A”中的以下值:A.IDNumber、A.Amount 和“表 B”值 B.IDNumber、B.Address、B.State、B.City、B.State, B.邮编。

感谢您对此的任何帮助!

4

3 回答 3

1

您可以使用下面的查询。这是一个有效的SQL Fiddle

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

它给出了这个输出

IDNumber 金额 ADDRESS CITY STATE ZIP
1 200.1 1 公共道路 Gotham AX 19281
(null) (null) 秘密蝙蝠洞 Gotham AX 19281
(null) (null) 海外隐匿处未指定 ?? 不适用
2 312.45 John Woo Lane Trespass TX 12345
(null) (null) 地址 City State 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

您的意思是,您只希望表 A 中的字段位于 B 的第一行结果中。

您执行此操作的方式取决于数据库。这是一种适用于大多数数据库的方法:

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 回答
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 回答