SQL查询返回一些等于0的行,但不应返回
我有三张桌子: ___卡德克斯SQL查询返回一些等于0的行,但不应返回,sql,Sql,我有三张桌子: ___卡德克斯 |--------|---------|-------------| | KDX_Id | KDX_VIP | KDX_Regular | |--------|---------|-------------| | 1 | No | No | | 2 | No | No | |--------|---------|-------------| ___可计费数据 |--------|----
|--------|---------|-------------|
| KDX_Id | KDX_VIP | KDX_Regular |
|--------|---------|-------------|
| 1 | No | No |
| 2 | No | No |
|--------|---------|-------------|
___可计费数据
|--------|---------------|
| BIL_Id | BIL_BookingId |
|--------|---------------|
| 1 | 99 |
| 2 | 99 |
| 3 | 100 |
|--------|---------------|
___预订
|--------|--------------|
| BOO_Id | BOO_ClientId |
|--------|--------------|
| 99 | 1 |
| 100 | 2 |
|--------|--------------|
我想循环到___; Kardex中,并为每个客户机计数:
- 客户预订的预订数量(包含in___;u预订)
- 客户花费的夜数(包含in____billabeldatas)
SELECT
KDX_Id,
(
SELECT COUNT(BOO_Id)
FROM ___Bookings
WHERE KDX_Id = ___Bookings.BOO_ClientId
) AS nb_bookings,
(
SELECT COUNT(BIL_Id)
FROM ___Bookings, ___BillableDatas
WHERE ___Bookings.BOO_Id = ___BillableDatas.BIL_BookingId
AND KDX_Id = ___Bookings.BOO_ClientId
) AS nb_nights
FROM ___Kardex
我的问题是:查询返回\uuuuuuukardex
中的所有行,而我只想要nb\u预订
或nb\u住宿
>=1的行
你能帮忙吗
这里是SQLFiddle:
预期结果是:
|--------|-------------|-----------|
| KDX_Id | nb_bookings | nb_nights |
|--------|-------------|-----------|
| 1 | 1 | 2 |
| 2 | 1 | 1 |
|--------|-------------|-----------|
谢谢。快速且肮脏,将子查询复制到
的WHERE
中,并检查它们是否>=1
SELECT
KDX_Id,
(
SELECT COUNT(BOO_Id)
FROM ___Bookings
WHERE KDX_Id = ___Bookings.BOO_ClientId
) AS nb_bookings,
(
SELECT COUNT(BIL_Id)
FROM ___Bookings, ___BillableDatas
WHERE ___Bookings.BOO_Id = ___BillableDatas.BIL_BookingId
AND KDX_Id = ___Bookings.BOO_ClientId
) AS nb_nights
FROM ___Kardex
WHERE
(
SELECT COUNT(BOO_Id)
FROM ___Bookings
WHERE KDX_Id = ___Bookings.BOO_ClientId
) >= 1
OR
(
SELECT COUNT(BIL_Id)
FROM ___Bookings, ___BillableDatas
WHERE ___Bookings.BOO_Id = ___BillableDatas.BIL_BookingId
AND KDX_Id = ___Bookings.BOO_ClientId
) >= 1
最简单的方法是子查询:
SELECT *
FROM (SELECT k.KDX_Id,
(SELECT COUNT(BOO_Id)
FROM ___Bookings b
WHERE k.KDX_Id = b.BOO_ClientId
) AS nb_bookings,
(SELECT COUNT(BIL_Id)
FROM ___Bookings b JOIN
___BillableDatas bd
ON b.BOO_Id = bd.BIL_BookingId AND
k.KDX_Id = b.BOO_ClientId
) AS nb_nights
FROM ___Kardex k
) k
WHERE nb_bookings > 0 OR nb_nights > 0;
请注意对查询的其他更改:
- 切勿在
子句中使用逗号。始终使用正确、明确、标准的FROM
语法JOIN
- 表别名使查询更易于编写和读取
- 当查询中有多个表时,请限定所有列引用
HAVING nb_bookings > 0 OR nb_nights > 0
在查询结束时。您也可以使用
连接
(即内部连接
),但要使用正确的显式连接语法:
请参见用您正在使用的数据库标记您的问题。我认为这比这更容易。。。我怀疑这个问题陈述得很糟糕,如果没有有效的账单,就不可能进行预订,这样OP就可以通过KDX_Id加入表和组
select k.KDX_Id,t.nb_bookings, t1.nb_nights
from ___Kardex k
inner join (
select BOO_ClientId, count(*) nb_bookings
from ___Bookings
group by BOO_ClientId
) t on t.BOO_ClientId = k.KDX_Id
inner join (
select b.BOO_ClientId, COUNT(bl.BIL_Id) nb_nights
from ___Bookings b
inner join ___BillableDatas bl on bl.BIL_BookingId = b.BOO_Id
group by b.BOO_ClientId
) t1 on t1.BOO_ClientId = k.KDX_Id;
select k.KDX_Id, COUNT(BOO_Id) as nb_bookings, COUNT(bd.BIL_Id) as nb_nights
from ___Kardex k
inner join ___Bookings b on k.KDX_Id = b.BOO_ClientId
inner join ___BillableDatas bd on bd.BIL_BookingId = b.BOO_Id
group by k.KDX_Id