2016-04-22 97 views
2

我是Microsoft SQL Server的新手,需要一个查询来返回WHERE子句中列出的所有记录,甚至重复。我拥有的只会返回3行。SQL查询结果需要返回WHERE子句中的所有记录甚至重复

我正在阅读和使用c#解析文本文件。通过该文本文件,我创建了一个查询以从数据库获取结果,然后使用结果重建该文本文件。原始文本文件包含重复的行。每行都需要关联到从数据库中检索的数据。 -

SELECT tbl1.HdrCode, tbl1.HdrName 
FROM Table1 tbl1 
WHERE tbl1.HdrCode 
IN ('000520', 
'000531', 
'000531', 
'000636') 

什么,我需要回到是:

000520 Name1 
000531 Name2 
000531 Name2 
000636 Name3 

感谢

+0

您列出的内容应显示您列出的所有记录中的所有4条记录,但您不需要第二个“000531”值,则可以执行此操作。你看到了什么结果?你确定这是你正在使用的查询吗?同样来自其他人的回应,我想知道我是否能够正确理解你的问题......你能解释一些吗? – Goose

+0

*我需要返回的是*这很让我困惑 –

+0

请从查询中删除星号,因为你编辑它。他们在那里让where子句中的两个HdrCodes看起来很大胆。 – Dresden

回答

2

尝试是这样的

你需要一个内嵌表与你的价值观和JOIN与你的表,而不是IN子句

SELECT tb1.* 
FROM (VALUES ('000520'), 
       ('000531'), 
       ('000531'), 
       ('000636')) tc (hdrcode) 
     JOIN table1 tbl1 
     ON tc.hdrcode = tb1.hdrcode 
+0

这正是我需要的。谢谢。 – Eric

1

这不是事情在SQL是如何工作的。一个查询将只返回那里。如果您的表格中只有3行,并且只有其中一个具有HdrCode 000531,则它将仅通过该种查询返回一次。


如果你只是想解决这个具体的例子,你可以使用:

SELECT tbl1.HdrCode, tbl1.HdrName FROM Table1 tbl1 WHERE tbl1.HdrCode = '000520' 
UNION ALL 
SELECT tbl1.HdrCode, tbl1.HdrName FROM Table1 tbl1 WHERE tbl1.HdrCode = '000531' 
UNION ALL 
SELECT tbl1.HdrCode, tbl1.HdrName FROM Table1 tbl1 WHERE tbl1.HdrCode = '000531' 
UNION ALL 
SELECT tbl1.HdrCode, tbl1.HdrName FROM Table1 tbl1 WHERE tbl1.HdrCode = '000636' 
+0

这是正确的。按照您希望的方式获得两行的唯一方法是如果表中存在两行,并且具有相同的HdrCode(000531)。只需为您的IN指定相同的值两次将不会显示两次。 – Dresden

+0

是否有不同的方式来做到这一点在SQL? – Eric

+0

你能描述一下总体目标是什么吗?请不要说“重复记录”。我的意思是你为什么要做这件事的更大的想法。例如,您想以什么标准重复一个值,而不是其他值。什么决定了记录应该重复多少次。 –

0

您需要一个UNION ALL子句来指定这两个选择。 在您的例子,你需要这样的事情:

SELECT tbl1.HdrCode, tbl1.HdrName 
FROM Table1 tbl1 
WHERE tbl1.HdrCode 
IN ('000520','000531','000636') 
UNION ALL 
SELECT tbl1.HdrCode, tbl1.HdrName 
FROM Table1 tbl1 
WHERE tbl1.HdrCode 
IN ('000531') 
ORDER BY HdrCode 

这是SqlFiddle

但如前所述,您应该在这里思考整个情况;不只是你的例子,因为这个例子的解决方案可能不适合你的查询的真正目的。