使用 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

虽然这可能回答了这个问题,但外键仅引用列中的唯一值,例如主键或唯一列。引用值最好是一个整数,主键往往是整数,因为它们比字符串更有效地存储和连接。