我有3张桌子:
DECLARE @PRODUCT TABLE(PRODUCTID INT,TITLE NVARCHAR(MAX),BRANDID INT,SPECID INT)
DECLARE @SPEC TABLE(SPECID INT,TITLE NVARCHAR(MAX))
DECLARE @BRAND TABLE(BRANDID INT,TITLE NVARCHAR(MAX))
INSERT INTO @PRODUCT
SELECT 1,'TV',1,8 UNION ALL
SELECT 2,'PC',2,12
INSERT INTO @BRAND
SELECT 1,'SAMSUN' UNION ALL
SELECT 2,'GRUNDING'
INSERT INTO @SPEC
SELECT 8,'PRICE' UNION ALL
SELECT 9,'WEIGHT'
如果 @BRAND 或 @SPEC 中至少有一个,我想从 @PRODUCT 表中获得结果 表有数据。所以我尝试使用 LEFT JOIN :
SELECT p.* ,
s.*,
b.*
FROM @PRODUCT p
LEFT JOIN @BRAND b ON b.BRANDID = p.BRANDID AND b.BRANDID IS NOT NULL
LEFT JOIN @SPEC s ON s.SPECID = p.SPECID AND s.SPECID IS NOT NULL
但无法得到理想的结果。对于我提供的数据,我想仅使用标题电视过滤产品。所以,我想应用可选的加入。我的意思是如果@BRAND或@SPEC表有数据,或者两者都有数据,它应该根据这些条件过滤产品。
任何人都可以帮我解决这个问题吗?
修改 根据要求,我为表格提供了更多数据。
INSERT INTO @PRODUCT
SELECT 1,'TV',1,8 UNION ALL
SELECT 2,'PC',2,12 UNION ALL
SELECT 2,'PHONE',505,10
INSERT INTO @BRAND
SELECT 1,'SAMSUN' UNION ALL
SELECT 2,'GRUNDING'
INSERT INTO @SPEC
SELECT 8,'PRICE' UNION ALL
SELECT 9,'WEIGHT' UNION ALL
SELECT 10,'SIZE'
对于这些数据,我想只获得ProductID = 1的Product行。所以,我只需要在这个例子中选择这一行。
答案 0 :(得分:1)
以下作品。我刚尝试过。我唯一改变的是将WHERE s.SPECID IS NOT NULL
从ON CLAUSE
移到WHERE CLAUSE
。将它放在ON CLAUSE
的{{1}}中仅限制它用于连接但仍返回该行。将其放入LEFT JOIN
过滤行。
WHERE CLAUSE
答案 1 :(得分:1)
如果您在dbo.Product.BRANDID
和dbo.Product.SPECID
列上定义了外键约束(并且它们是可信的),那么您可以检查这两个值(列)中的一个是否不为NULL(IS NOT NULL) )使用WHERE子句:
SELECT ...
FROM @PRODUCT p
LEFT JOIN @BRAND b ON b.BRANDID = p.BRANDID
LEFT JOIN @SPEC s ON s.SPECID = p.SPECID
WHERE p.BRANDID IS NOT NULL OR p.SPECID IS NOT NULL
答案 2 :(得分:0)
如果我了解您正在寻找的内容,则应首先进行连接,然后进行过滤。类似的东西:
SELECT
p.* ,
s.*,
b.*
FROM
@PRODUCT p
LEFT JOIN
@BRAND b
ON
b.BRANDID = p.BRANDID
LEFT JOIN
@SPEC s
ON
s.SPECID = p.SPECID
WHERE
b.BRANDID IS NOT NULL OR s.SPECID IS NOT NULL