使用 JOIN 从三个表中获取数据
Get data from three tables with JOIN
场景是这样的。一共有三个表,TableA,TableB和TableC
Table一个
Id
Name
ProductId
1
product1
prod1
2
product2
prod2
TableB
Id
Name
ProductId
Code
1
RandomName
prod2
testcode
TableC
Id
OfferName
ProductId
Code
1
HappyOffer
prod1
testcode
预期结果
TableA.ProductId
TableA.Name
TableB.Name
TableC.OfferName
prod2
product2
RandomName
null
prod1
product1
null
HappyOffer
Table A 的 ProductId 是 TableB 和 Table C 的 ProductId 的外键。
通过使用基于代码 'testcode'
的 where 子句来获得预期结果的查询是什么
我认为内部联接可以帮助你。
SELECT column_name(s)
FROM TableA
INNER JOIN TableB
ON TableA.ProductId = TableB.ProductId
INNER JOIN TableC ON TableA.ProductId =
TableC.ProductId);
您将希望使用左连接,因为当连接条件不匹配时 returns null。在 TableB 和 TableC 的 where 子句中,您添加了 'testcode' 的筛选。如果您想要缩写代码,请为 TableA (TA)、TableB (TB) 和 TableC (TC) 使用 table 别名。
假设 SQL 服务器:
CREATE TABLE #tableA (id int, Name varchar(100), ProductId varchar(100))
CREATE TABLE #tableB (id int, Name varchar(100), ProductId varchar(100), Code varchar(100))
CREATE TABLE #tableC (id int, OfferName varchar(100), ProductId varchar(100), Code varchar(100))
INSERT INTO #tableA VALUES (1, 'product1', 'prod1'), (2, 'product2', 'prod2')
INSERT INTO #tableB VALUES (1, 'RandomName', 'prod2', 'testcode')
INSERT INTO #tableC VALUES (1, 'HappyOffer', 'prod1', 'testcode')
--Your DDL values above
SELECT TA.ProductId AS [TableA.ProductId]
,TA.Name AS [TableA.Name]
,TB.Name AS [TableB.Name]
,TC.OfferName AS [TableC.OfferName]
FROM #tableA TA
LEFT JOIN #tableB AS TB ON TA.ProductId = TB.ProductId
LEFT JOIN #tableC AS TC ON TA.ProductId = TC.ProductId
WHERE (TB.Code = 'testcode' OR TC.Code = 'testcode')
--put the ordering here as a bonus, since you wanted prod2 listed first in the ProductId
ORDER BY CASE WHEN TA.ProductId = 'prod2' THEN 1 ELSE 2 END
/* --to drop the temp tables afterwards
DROP TABLE #tableA
DROP TABLE #tableB
DROP TABLE #tableC
*/
产生输出:
TableA.ProductId TableA.Name TableB.Name TableC.OfferName
---------------- ----------- ----------- ----------------
prod2 product2 RandomName NULL
prod1 product1 NULL HappyOffer
虽然这可能回答了这个问题,但外键仅引用列中的唯一值,例如主键或唯一列。引用值最好是一个整数,主键往往是整数,因为它们比字符串更有效地存储和连接。
场景是这样的。一共有三个表,TableA,TableB和TableC
Table一个
Id | Name | ProductId |
---|---|---|
1 | product1 | prod1 |
2 | product2 | prod2 |
TableB
Id | Name | ProductId | Code |
---|---|---|---|
1 | RandomName | prod2 | testcode |
TableC
Id | OfferName | ProductId | Code |
---|---|---|---|
1 | HappyOffer | prod1 | testcode |
预期结果
TableA.ProductId | TableA.Name | TableB.Name | TableC.OfferName |
---|---|---|---|
prod2 | product2 | RandomName | null |
prod1 | product1 | null | HappyOffer |
Table A 的 ProductId 是 TableB 和 Table C 的 ProductId 的外键。
通过使用基于代码 'testcode'
的 where 子句来获得预期结果的查询是什么我认为内部联接可以帮助你。
SELECT column_name(s)
FROM TableA
INNER JOIN TableB
ON TableA.ProductId = TableB.ProductId
INNER JOIN TableC ON TableA.ProductId =
TableC.ProductId);
您将希望使用左连接,因为当连接条件不匹配时 returns null。在 TableB 和 TableC 的 where 子句中,您添加了 'testcode' 的筛选。如果您想要缩写代码,请为 TableA (TA)、TableB (TB) 和 TableC (TC) 使用 table 别名。
假设 SQL 服务器:
CREATE TABLE #tableA (id int, Name varchar(100), ProductId varchar(100))
CREATE TABLE #tableB (id int, Name varchar(100), ProductId varchar(100), Code varchar(100))
CREATE TABLE #tableC (id int, OfferName varchar(100), ProductId varchar(100), Code varchar(100))
INSERT INTO #tableA VALUES (1, 'product1', 'prod1'), (2, 'product2', 'prod2')
INSERT INTO #tableB VALUES (1, 'RandomName', 'prod2', 'testcode')
INSERT INTO #tableC VALUES (1, 'HappyOffer', 'prod1', 'testcode')
--Your DDL values above
SELECT TA.ProductId AS [TableA.ProductId]
,TA.Name AS [TableA.Name]
,TB.Name AS [TableB.Name]
,TC.OfferName AS [TableC.OfferName]
FROM #tableA TA
LEFT JOIN #tableB AS TB ON TA.ProductId = TB.ProductId
LEFT JOIN #tableC AS TC ON TA.ProductId = TC.ProductId
WHERE (TB.Code = 'testcode' OR TC.Code = 'testcode')
--put the ordering here as a bonus, since you wanted prod2 listed first in the ProductId
ORDER BY CASE WHEN TA.ProductId = 'prod2' THEN 1 ELSE 2 END
/* --to drop the temp tables afterwards
DROP TABLE #tableA
DROP TABLE #tableB
DROP TABLE #tableC
*/
产生输出:
TableA.ProductId TableA.Name TableB.Name TableC.OfferName
---------------- ----------- ----------- ----------------
prod2 product2 RandomName NULL
prod1 product1 NULL HappyOffer
虽然这可能回答了这个问题,但外键仅引用列中的唯一值,例如主键或唯一列。引用值最好是一个整数,主键往往是整数,因为它们比字符串更有效地存储和连接。