如何在SQL中显示多个表中的数据,但仅当一个列数据与另一列匹配时才显示?

时间:2019-02-08 14:42:02

标签: sql sql-server

我仍在学习SQL,所以这可能只是我的无知或无法在搜索中表达我要查找的内容。我花了大约一个小时来搜索标题的某些变体(在这里和Google上的常规搜索)。抱歉,我显然也不知道该如何格式化。发布后,我将尝试对其进行清理。

我有一个我没有设计的客户数据数据库。在GUI中,有多个选项卡,似乎每个选项卡都获得了自己的表。这些表与一个称为RecordID的字段链接在一起。在表之一中是“客户数据”选项卡。它的组织方式是,表A中的单个客户记录可以在表B中具有多行。我只希望表B中B列的数据是“ CompanyA”,并且如果表B中的A列=1。下面是示例数据

预期输出:

CardNumber  LastName  FirstName  CustomerID  DataItem
------------------------------------------------------
32154       Clapton   Eric       181212      CompanyA

表A

RecordID    CardNumber    LastName    FirstName    CustomerID
---------------------------------------------------------------
1           12345         Smith       John         190201
2           12346         Jones       Sandy        190202
3           23456         Petty       Tom          190203
4           32154         Clapton     Eric         181212
5           14728         Tyler       Steven       180225

表B

RecordID    DataID    DataItem
--------------------------------
1           0         CompanyA
1           1         Yes
1           2         No
1           3         Revoked
1           4         NULL
1           5         CompanyB
2           0         CompanyB
2           1         Yes
2           2         No
2           3         NULL
2           4         24-54A
2           5         CompanyC
3           0         CompanyA
3           1         No
3           2         No
3           3         NULL
3           4         68-69B
3           5         NULL
4           0         CompanyA
4           1         Yes
4           2         Yes
5           0         CompanyB
5           1         No
5           2         No
5           5         CompanyA

5 个答案:

答案 0 :(得分:2)

您要寻找的概念是JOIN。在这种情况下,您特别需要一个INNER JOIN。联接根据您指定的条件(例如,字段中的匹配值)将两个表连接在一起,并将结果合并到输出中的一个表中。

以下是适合您情况的示例:

SELECT 
  A.CardNumber, 
  A.LastName, 
  A.FirstName,   
  A.CustomerID, 
  B.DataItem
FROM
  TableA A 
  INNER JOIN TableB B -- join tableB onto tableA
    ON A.RecordID = B.RecordID -- in the ON clause you specify criteria by you match the fields
WHERE 
  B.columnA = 'CompanyA' 
  AND B.columnB = 1

以下是相关的SQL Server Documentation

我也建议您有可能全面学习SQL入门教程和/或查找书籍。一个好的人会以合乎逻辑的方式向您介绍诸如此类的所有基本,关键概念,然后您就不会暗中尝试谷歌搜索您不知道正确术语的事物。

答案 1 :(得分:1)

select a.CardNumber, a.LastName, a.FirstName,   a.CustomerID, b.dataitem 
from tableA A inner join TableB b
on a.recordid = b.recordid 
where b.columnA= 'CompanyA' and b.columnB = 1

答案 2 :(得分:1)

这是您的解决方案,

select a.CardNumber,  a.LastName,  a.FirstName,  a.CustomerID,  b.DataItem from 
tableA a
inner join tableB b
on (a.RecordID = b.RecordID)
where
b.DataItem='CompanyA'
b.RecordID=1;

让我知道结果是否与预期不符

答案 3 :(得分:0)

在数据库引擎级别,如果您使用的是Microsoft技术,那么最有效的结构是在表B上使用索引外键约束,并在表A上使用主代理键(PSK)列。您的案例位于父表Table A上,称为RecordID。具有FKC的外键列在表B上名为RecordID的列上。一旦确认存在FKC(表B上的外键约束,即将两个名为RecordID的列固定在两个表之间的匹配值上),然后对GUI进行寻址。在GUI的选项卡之间,通常表示您有一个具有一组唯一记录ID的父表(一个名为Record ID的列,每行中都有绝对唯一的值,并且该列上没有空行)。 GUI的每个选项卡上还将有子表,这些子表以“一对多(1:M)”的方式绑定到父表,其中1个父表有许多子表。您的评论或问题表明您也要过滤,其中相关选项卡之一中子级的记录ID等于记录ID的整数1。因此,在某处需要查询:

p_id    starts_on    ends_on
-----------------------------
1      2018-01-01   2018-12-31
1      2018-02-01   2018-12-31
1      2018-03-01   2018-12-31
.       .            .
.       .            .
1      2018-11-01   2018-12-31
1      2018-12-01   2018-12-31
2      2018-05-03   2018-12-31
2      2018-06-03   2018-12-31
.       .            .
.       .            .
2      2018-12-03   2018-12-31
3      2018-06-01   2018-07-30

有帮助吗?

答案 4 :(得分:0)

您的问题很难理解,但让我给您一个类似于我想您正在问的例子的例子。

SELECT a.*, b.DataItem FROM A a INNER JOIN B b
            ON a.RecordID = b.RecordID AND
                b.DataItem = `CompanyA`