Sql 两个独立的查询;一个需要从另一个数行
我有两个不同的问题。一个用于详细信息文件,另一个用于结束/结束文件(我也有一个头文件,但该头文件与此问题无关)。我将不得不保持这些单独的,因为它们将返回不同的列 问题是我的详细信息文件有13470行,但当我在二次查询(拖车文件)中进行计数时,我得到13207行。原因是少数项目具有多个与主项目ID关联的辅助ID 如果不使用Sql 两个独立的查询;一个需要从另一个数行,sql,sql-server,sql-server-2012,count,Sql,Sql Server,Sql Server 2012,Count,我有两个不同的问题。一个用于详细信息文件,另一个用于结束/结束文件(我也有一个头文件,但该头文件与此问题无关)。我将不得不保持这些单独的,因为它们将返回不同的列 问题是我的详细信息文件有13470行,但当我在二次查询(拖车文件)中进行计数时,我得到13207行。原因是少数项目具有多个与主项目ID关联的辅助ID 如果不使用选择DISTINCT,我可以得到相同的计数,但它会返回25250行。我需要在我的详细资料文件中保留副本 详细信息查询相当长,但请理解,尽管几乎所有记录都是唯一的,但在某些情况下,
选择DISTINCT
,我可以得到相同的计数,但它会返回25250行。我需要在我的详细资料文件中保留副本
详细信息查询相当长,但请理解,尽管几乎所有记录都是唯一的,但在某些情况下,主项ID似乎是重复的,只是因为辅助项ID的主项ID可能有几个不同的值
我读过下面的文章,但似乎一篇也没用。请注意,我使用的是Microsoft SQL Server 2012,而不是MySQL,但我确实将MySQL的概念应用到了我的需求中,其中一篇文章对此进行了解释:
同样,我希望根据我在详细信息文件中指定的所有条件(几十列和13470行)得到一个计数。我的拖车文件只有两列和一行。一个用于标识结束/结束文件,另一个用于显示应由详细信息文件返回的记录数
下面是我的“试着看看这是否有效或是否在正确的路径上”查询(但它没有):
这将返回25250行
当然,CASE
语句是错误的,但我只是想把它作为一个选项来探讨。有人知道我如何让我的查询同步吗
再次:
- Microsoft SQL Server 2012
- 1头文件(works)
- 1详细资料文件(工程)
- 1个拖车文件(未按预期工作)
案例的拖车结果
语句:
| RECID | TOTREC |
--------------------
1 | TRL | 25250 |
拖车结果仅在其中一列上计数DISTINCT
:
| RECID | TOTREC |
--------------------
1 | TRL | 13207 |
寻找:
| RECID | TOTREC |
--------------------
1 | TRL | 13470 |
如有任何建议,将不胜感激。谢谢
编辑
这里是详细文件查询,但我删除了不相关的列;我执行了此查询,其工作原理与未编辑的查询相同,因此这应该足以说明:
SELECT DISTINCT
RTRIM(CAST('DTL' AS VARCHAR(3))) AS RECID,
RTRIM(CAST('12345' AS VARCHAR(10))) AS COMPANY,
RTRIM(CAST(CASE
WHEN I2.VNDITNUM = ''
THEN 'BLANK'
ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
RTRIM(CAST(I.ITEMDESC AS VARCHAR(60))) AS ITMDESC,
RTRIM(CAST(CASE
WHEN I.INACTIVE = '0'
THEN 'A'
WHEN I.INACTIVE = '1'
THEN 'I' END AS VARCHAR(1))) AS STATUS
FROM Inv00101 I
JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')
请注意,ITEMNMBR
是主要的内部ID,而VNDITNUM
是供应商/供应商ID,我称之为次要ID。对于产品的唯一主要内部ID,VNDITNUM
有时有多条记录
正常结果如下:
| RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS |
------------------------------------------------------------
1 | DTL | 12345 | 011223 | 100234 | Game | A |
2 | DTL | 12345 | 015992 | 104722 | Picture | A |
但以下是一个可能重复的示例:
| RECID | COMPANY | VNDITEM | NUMITEM | ITMDESC | STATUS |
------------------------------------------------------------
1 | DTL | 12345 | 029445 | 109777 | Book A | A |
2 | DTL | 12345 | 029478 | 109777 | Book A | A |
如果您的“拖车”查询只返回1条记录。。。然后您可以尝试使用tsql函数
@@recordcount
像这样:
-- Declare an integer variable
DECLARE @rc as integer;
-- Your Detail query
SELECT
IDont
,CareWhat
,TheDetailLogicIs
FROM
Inv00101 as i
JOIN WhoKnowsWhat as idk ON i.ITEMNMBR = idk.ITEMNMBR
WHERE
Who = Cares;
-- Assign your row count variable with the row count of the last executed query.
SET @rc = @@rowcount;
-- Your new Trailer query
SELECT
'TRL' AS [RECID]
,@rc AS [TOTREC];
这样做的另一个好处是,您可以获得感兴趣的实际查询的行数。另外,您不必执行重复的逻辑,这可能会很耗时(特别是当您的详细信息查询像您想象的那样复杂时)
希望有帮助:)如果您的“拖车”查询只返回1条记录。。。然后您可以尝试使用tsql函数
@@recordcount
像这样:
-- Declare an integer variable
DECLARE @rc as integer;
-- Your Detail query
SELECT
IDont
,CareWhat
,TheDetailLogicIs
FROM
Inv00101 as i
JOIN WhoKnowsWhat as idk ON i.ITEMNMBR = idk.ITEMNMBR
WHERE
Who = Cares;
-- Assign your row count variable with the row count of the last executed query.
SET @rc = @@rowcount;
-- Your new Trailer query
SELECT
'TRL' AS [RECID]
,@rc AS [TOTREC];
这样做的另一个好处是,您可以获得感兴趣的实际查询的行数。另外,您不必执行重复的逻辑,这可能会很耗时(特别是当您的详细信息查询像您想象的那样复杂时)
希望有帮助:)我找到了一种使用派生表来实现这一点的方法,这样我仍然可以保持查询的独立性,并使用SSI来填充单独的平面文件(如果一个查询有多个select语句,而没有
UNION
s,则无法做到这一点)。谢谢大家帮我到达那里!非常感谢你的建议
以下是我使用的:
SELECT
CAST('TRL' AS VARCHAR(3)) AS RECID,
COUNT(TotalRows) AS TOTREC
FROM (SELECT DISTINCT
RTRIM(CAST(CASE
WHEN I2.VNDITNUM = ''
THEN 'BLANK'
ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
@@ROWCOUNT AS TotalRows,
I.ITMDESC
FROM Inv00101 I
JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')
我找到了一种使用派生表来实现这一点的方法,这样我仍然可以将查询分开,并使用SSI来填充单独的平面文件(如果一个查询有多个select语句而没有
UNION
s,则无法做到这一点)。谢谢大家帮我到达那里!非常感谢你的建议
以下是我使用的:
SELECT
CAST('TRL' AS VARCHAR(3)) AS RECID,
COUNT(TotalRows) AS TOTREC
FROM (SELECT DISTINCT
RTRIM(CAST(CASE
WHEN I2.VNDITNUM = ''
THEN 'BLANK'
ELSE I2.VNDITNUM END AS VARCHAR(20))) AS VNDITEM,
RTRIM(CAST(I.ITEMNMBR AS VARCHAR(20))) AS NUMITEM,
@@ROWCOUNT AS TotalRows,
I.ITMDESC
FROM Inv00101 I
JOIN Inv00102 I2 ON I2.ITEMNMBR = I.ITEMNMBR
JOIN ItemUnit I3 ON I3.ITEMNMBR = I.ITEMNMBR
LEFT OUTER JOIN prodmaster D ON D.itemid = I.ITEMNMBR
LEFT OUTER JOIN productinfo I4 ON I4.ITEMNMBR = I.ITEMNMBR
WHERE (ITMDESC LIKE '%ART%' OR ITMDESC LIKE '%CRAFT%')
您是否正在根据这些查询创建实际文件?或者只是结果集。@jderekc:你自己回答了这个问题。您说您在“详细信息”查询中使用了
次要ID
,但在“拖车”查询中没有使用它。如果次要ID
是“详细信息”查询选择条件的一部分,那么从逻辑上讲,您需要在“拖车”查询中使用次要ID
来获得相同的计数。您可以做的第二件事是:如果“拖车”查询始终只返回1条记录,您可以在“详细信息”查询之后立即使用tsql函数@@rowcount
。然后,您可以将实际的行数放入“拖车”中。您需要声明一个整数变量,如:将@rc声明为整数
然后在“详细信息”查询之后,为@rc分配行数:设置@rc=@@rowcount
然后在尾部查询中,您可以在需要行计数的位置使用@rc变量。这些查询结果集将导出到唯一的文件中。另外,如果您查看我的案例陈述,我试图包括两个ID进行比较,但我的逻辑不正确。@jderekc:您可能需要向我们显示您的“详细”查询,以便我们可以查看您的主ID
和辅助ID
的实际使用情况。如果您的“拖车”查询正在删除您的次要ID
记录,那么您的逻辑问题就在那里。您是否正在从这些查询创建实际文件?或者只是结果集。@jderekc:你回答了问题