如何使用表B中的条件在表A中找到所有在另一列中具有重复值的主ID?

时间:2019-06-04 20:51:15

标签: sql join subquery

抱歉,标题令人困惑,我很难描述我的问题。

  • 表A:保存帐号(PK)和社会保险号
  • 表B:保留帐号和帐户关闭日期。

表A中可以有多个具有相同社会保险号的帐户。

方案::我需要表A中的所有帐号,这些帐号具有基于表B中的帐号的匹配的社会保险号(也在表A中),但是我还需要添加一个是/否标记,如果帐号是表B中的特定帐号。

所以我的思路:我有一个基于特定帐户关闭日期的表B中的帐号列表:

SELECT TableB.acn 
FROM TableB 
WHERE tableB.CloseDate = '2019-06-30'

使用子查询,我可以从表A中获得所有帐户的列表:

SELECT TableA.Acn, TableA.SSN
FROM Table A
WHERE table A.SSN in (SELECT TableA.SSN 
                      FROM TableA 
                      INNER JOIN TableB ON TableA.ACN = TableB.ACN
                                WHERE tableB.closeDate = '2019-06-30')

但这就是我的难处,因为我不知道如何

  • 在列表中添加一个标志,以显示该帐号是表B中的帐号,
  • 从表A中删除所有其他没有重复SSN的帐户。

任何帮助都会很棒。接下来的一个小时左右,我将进行大量监视,以防有人有任何后续问题。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您只想标记是否存在匹配项,那么我认为这可以满足您的要求:

public function insertOrder($data){
    $errors = $this->validate( $data );
    if (empty($errors)) {
      $sql = "INSERT INTO `orders` (`amount`) VALUES (:amount)";
      $stmt = $this->pdo->prepare($sql);
      $stmt->bindValue(':amount', $data['amount']);
      if ($stmt->execute()) {
        return $this->selectOrderById($this->pdo->lastInsertId());
      }
    }
    return false;
  }

  public function insertCartItem($dataB){
    $errors = $this->validateB($dataB);
    if (empty($errors)) {
      $sql = "INSERT INTO `cart_items` (`order_id` `product_id`,`quantity`) VALUES (:order_id, :product_id, :quantity)";
      $stmt = $this->pdo->prepare($sql);
      $stmt->bindValue(':order_id', $dataB['order_id']);
      $stmt->bindValue(':product_id', $dataB['product_id']);
      $stmt->bindValue(':quantity', $dataB['quantity']);
      if ($stmt->execute()) {
        return $this->selectCartItemById($this->pdo->lastInsertId());
      }
    }
    return false;
  }

答案 1 :(得分:0)

尝试这个sql fiddle

数据

create table acct_and_ssn (
acct int,
ssn varchar(255) 
);

insert into acct_and_ssn (acct, ssn)
values 
(1, 123456789),
(2, 123456789),
(3, 123456789),
(4, 223456789),
(5, 223456789),
(6, 333456789),
(7, 333456789),
(8, 333456789),
(9, 444567889),
(10, 444567889)
;


create table acct_and_date (
acct int,
mydate date 
);

insert into acct_and_date (acct, mydate)
values 
(2, '06/30/2019'),
(6, '06/30/2019'),
(9, '04/12/2019')
;

帐户2和6符合我们的标准。与2和6相关联的SSN也与帐户1、3、7和8相关联。

with flagged_accounts_cte (acct, ssn) as
(
select 
a.acct, 
a.ssn

from 
acct_and_ssn a inner join acct_and_date b
on a.acct = b.acct and b.mydate = '06/30/2019'
)
select
c.acct,
c.ssn, 
(case
when c.acct = d.acct then 1 else 0 
 end) as myflag
from 
acct_and_ssn c
inner join flagged_accounts_cte d
on c.ssn = d.ssn

创建一个子查询(此处为CTE),以标识已关闭的帐户,然后将其与SSN备份到表中以查找其他帐户。

给我们

acct ssn myflag 1 123456789 0 2 123456789 1 3 123456789 0 6 333456789 1 7 333456789 0 8 333456789 0