我仍在学习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
答案 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`