Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询返回一些等于0的行,但不应返回_Sql - Fatal编程技术网

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
    语法
  • 表别名使查询更易于编写和读取
  • 当查询中有多个表时,请限定所有列引用
如果您使用的是MySQL,您甚至不需要子查询。你可以把:

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