我试图返回与商店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
谢谢
答案 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
因此,使用上述查询时的“预期结果”(来自该数据)是“无结果”。但是,如果您更正了数据,以便注册只能引用现有商店,那么当您使用where sl.id <> 1
从数据模型图像中获取的数据
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 *”中的任何一个,这只是一个偏好的问题。你使用。