Необходимо несколько внутренних соединений, чтобы проверить, существуют ли строки? - SQL Сервер - PullRequest
0 голосов
/ 29 апреля 2020

Я повторно отправил этот вопрос, так как в нем были ошибки, которые, как мне кажется, я сейчас исправил, извинения.

Хорошо, следующая хранимая процедура работает нормально, но мне нужно добавить еще одно условие по отношению к другому стол называется tblItems. Мне требуется tblAccounts.accountID, чтобы присоединиться к tblItems.AccountID, чтобы я мог проверить, если tblItems.fileID > 0, и если да, то вернуть результаты. Вот таблицы, которые у меня есть и ожидаемые результаты ..

TBLACCOUNTS: AccountID, ContactName, SkypeUserName, friendlyOrderID

TBLORDERS: AccountID, ItemsAllowed

TBLITEMS: AccountID, FileID, ImageUrl

Я надеюсь достичь следующего:

4B900A74-E2D9-4837-B9A4-9E828752716E  PETER     PETE  827365
E82882D9-4837-B9A4-9E82-22228752716E  MATTHEW   MATT  373926
4B900A74-2323-1414-2525235252533333D  JONATHAN  JON   732792...

Именно так поступает первый приведенный ниже кодовый блок. Но мне нужны только строки, где у каждого пользователя есть хотя бы 1 fileID в tblItems. Результаты, которые я получаю, когда я пробую второй кодовый блок ниже, следующие:

4B900A74-E2D9-4837-B9A4-9E828752716E  PETER     PETE  827365
4B900A74-E2D9-4837-B9A4-9E828752716E  PETER     PETE  827365
4B900A74-E2D9-4837-B9A4-9E828752716E  PETER     PETE  827365...

Codeblock1

SELECT 
    *,
    CASE WHEN RowNo < cnt THEN 'N' ELSE 'Y' END AS lastbox
FROM
    (SELECT 
         ROW_NUMBER() OVER (ORDER BY dateAdded DESC) AS [RowNo],
         COUNT(*) OVER () cnt,
         tblAccounts.skypeUserName, tblAccounts.contactName, 
         tblorders.friendlyOrderID
     FROM 
         tblOrders
     INNER JOIN 
         tblAccounts ON tblOrders.accountID = tblAccounts.accountID
     WHERE 
         bootSaleDate = @bootSaleDate AND orderStatus = 'Completed') t
WHERE 
    RowNo BETWEEN (@page * 8) - 7 AND (@page * 8)

Вот что я пробовал (Codeblock2) ..

SELECT *,
CASE WHEN RowNo < cnt THEN 'N' ELSE 'Y' END AS lastbox
    FROM
    (
    SELECT ROW_NUMBER() OVER (ORDER BY orderDate desc) as [RowNo],
    COUNT(*) OVER () cnt,
    tblAccounts.skypeUserName, tblAccounts.contactName, tblorders.friendlyOrderID
    FROM tblOrders
    INNER JOIN tblAccounts ON tblOrders.accountID=tblAccounts.accountID
    INNER JOIN tblItems ON tblOrders.accountID=tblItems.accountID
    WHERE EXISTS(select 1 from tblItems WHERE tblItems.fileID > 0 AND tblItems.accountID = 
    tblOrders.accountID AND tblOrders.bootSaleDate = @bootSaleDate)  AND tblOrders.bootSaleDate = 
    @bootSaleDate AND tblOrders.orderStatus='Completed' 
    ) t
WHERE RowNo BETWEEN (@page*8)-7 AND (@page*8)

1 Ответ

1 голос
/ 29 апреля 2020

Может быть, вы имеете в виду нечто подобное, когда подзапрос определяет, сколько строк существует для таблицы с fileid> 0

 drop table tblorders
 drop table tblaccounts
 drop table tblitems
 go

 create table tblorders (accountid int,orderdate smalldatetime,friendlyorderid int,
                bootsaledate smalldatetime, orderstatus varchar(10))
 create table tblaccounts(accountid int,skypeusername varchar(3),contactname varchar(3))
 create table tblitems(accountid int,fileid int)
 insert into tblorders values
 (1,'2020-04-29',1,'2020-04-29','completed'),
 (2,'2020-04-29',1,'2020-04-29','completed')

 insert into tblaccounts values
 (1,'aaa','aaa'),
 (2,'bbb','bbb')

 truncate table tblitems
 insert into tblitems values
 (1,0),(2,2),(1,1)
 declare @bootsaledate smalldatetime
 set @bootsaledate = '2020-04-29'
 SELECT tblorders.accountid,tblaccounts.accountid,s.accountid,
        ROW_NUMBER() OVER (ORDER BY orderDate desc) as [RowNo],
    COUNT(*) OVER () cnt,
    tblAccounts.skypeUserName, tblAccounts.contactName, tblorders.friendlyOrderID
    FROM tblOrders
    INNER JOIN tblAccounts ON tblOrders.accountID=tblAccounts.accountID
    INNER JOIN 
        (select accountid,sum(case when fileid > 0 then 1 else 0 end) fileid 
        from tblitems
        group by accountid) s  ON tblOrders.accountID=s.accountID
    WHERE s.fileID > 0 
    AND tblOrders.bootSaleDate = @bootSaleDate 
    AND tblOrders.orderStatus='Completed' ;

 accountid   accountid   accountid   RowNo                cnt         skypeUserName contactName friendlyOrderID
----------- ----------- ----------- -------------------- ----------- ------------- ----------- ---------------
1           1           1           1                    2           aaa           aaa         1
2           2           2           2                    2           bbb           bbb         1
...