(可选)使用可能的NULL值连接SQL中的表

时间:2013-12-22 18:48:30

标签: sql sql-server left-join optional

我有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行。所以,我只需要在这个例子中选择这一行。

3 个答案:

答案 0 :(得分:1)

以下作品。我刚尝试过。我唯一改变的是将WHERE s.SPECID IS NOT NULLON CLAUSE移到WHERE CLAUSE。将它放在ON CLAUSE的{​​{1}}中仅限制它用于连接但仍返回该行。将其放入LEFT JOIN过滤行。

WHERE CLAUSE

答案 1 :(得分:1)

如果您在dbo.Product.BRANDIDdbo.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