SQL连接和内部连接是null

时间:2017-10-26 02:54:09

标签: sql-server join inner-join

DB schema diagram here

我试图返回与商店ID无关的优惠券列表1我试图退回优惠券1

这是我的努力

Select c.id
from Coupon c
left join signups s on s.couponid = c.id
inner join storelist sl on sl.groupid = s.groupid
where sl,id = 1 and s.couponid is null

谢谢

3 个答案:

答案 0 :(得分:0)

在where子句中使用“not equal”:

select c.id
from Coupon c
inner join signups s on s.couponid = c.id
inner join storelist sl on sl.groupid = s.groupid
where sl.id <> 1

编辑2

enter image description here

因此,使用上述查询时的“预期结果”(来自该数据)是“无结果”。但是,如果您更正了数据,以便注册只能引用现有商店,那么当您使用where sl.id <> 1

时,您会看到列出的商店2

编辑1

从数据模型图像中获取的数据

enter image description here

CREATE TABLE StoreList
    ([id] int, [groupid] int, [address] varchar(50))
;

INSERT INTO StoreList
    ([id], [groupid], [address])
VALUES
    (1, 3, '35 Sharkey Rd'),
    (2, 4, '56 Jim Road')
;


CREATE TABLE signups
    ([id] int, [groupid] int, [couponid] int)
;

INSERT INTO signups
    ([id], [groupid], [couponid])
VALUES
    (1, 1, 2),
    (2, 3, 2)
;


CREATE TABLE Coupon
    ([id] int, [name] varchar(8))
;

INSERT INTO Coupon
    ([id], [name])
VALUES
    (1, 'coupon 1'),
    (2, 'coupon 2')
;

select sl.id as sl_id, *
from Coupon c
inner join signups s on s.couponid = c.id
inner join storelist sl on sl.groupid = s.groupid

;

select sl.id as sl_id, *
from Coupon c
inner join signups s on s.couponid = c.id
inner join storelist sl on sl.groupid = s.groupid
where sl.id <> 1
;
GO
sl_id | id | name     | id | groupid | couponid | id | groupid | address      
----: | -: | :------- | -: | ------: | -------: | -: | ------: | :------------
    1 |  2 | coupon 2 |  2 |       3 |        2 |  1 |       3 | 35 Sharkey Rd

sl_id | id | name | id | groupid | couponid | id | groupid | address
----: | -: | :--- | -: | ------: | -------: | -: | ------: | :------

dbfiddle here

从上面的证据可以看出,如果sl.id不等于1,那么确实不会返回id为1的商店。

答案 1 :(得分:0)

除非您要从注册和商店列表表中返回列,否则我会像这样处理您的问题;只需从优惠券表中选择并使用range(1,6)过滤掉指定的商店。

NOT IN

答案 2 :(得分:0)

要发现注册表中根本未引用的优惠券,一个简单的选项是使用“左排除连接”:

select c.*
from coupons c
left join signups s on c.couponid = s.couponid
where s.couponid IS NULL

在这里,您在注册中引用优惠券时执行连接,但是通过where子句排除那些匹配的行,只留下不匹配的行。

另一种选择是通过NOT EXISTS进行“半连接”:

select c.*
from coupons c
where NOT EXISTS (
     select NULL
     from signups s
     where c.couponid = s.couponid
     )

请注意,该子查询中的select子句未被计算,它确实存在,因为语法规则要求任何select查询以select关键字开头。 from和where子句提供测试EXISTS或NOT EXISTS所需的信息,因此可以使用这些“select NULL”,“select 1”或“select *”中的任何一个,这只是一个偏好的问题。你使用。