2017-01-31 60 views
0

我想弄清楚如何编码某个子查询。我不断收到“子查询返回超过1个值”的错误。我需要查询父级订单的描述而不是子级。SQL子查询列其中名称包含值

实施例:
父订单:100-01 儿童订单:100-02,100-03
每个订单具有描述。但是,在一个专栏中,我需要家长的描述:

WHERE [ORDER] LIKE '%-01' 

当前代码如下:

SELECT NAME as [Job], 
     [Master Job Desc] = (SELECT TOP 1 [DESCR] FROM TABLE WHERE [NAME] LIKE '%-01'), 
     LEFT(or_order.descr,30) as [Description], 
FROM TABLE 
ORDER BY OR_ORDER.DELIVERY asc, or_op.STARTSEC asc 

有什么建议?谢谢

编辑:我忘了,我已经尝试添加TOP 1到子查询,但它只是返回整个列相同的值。我不想那样,我想找到父母的工作订单。

编辑2:这是我正在寻找的单独的SQL。

SELECT [DESCR] FROM [Or_Order] WHERE [NAME] LIKE '%-01' 

上述语句返回名称包含父作业号(-01)的描述。我需要在一个专栏中。

+0

如何这些订单命名?连字符之前的数字是唯一的交易号码和01,02等线/子号码? – Kevin

+0

订单被命名为他们显示。示例“100-01”是父作业。 “100-02”是一个不同的工作,但它是“100-01”的孩子。它们在表格中是分开的行。 – Datallboy

+0

在我看来,你在这里苦苦挣扎,因为你的数据通过将两个数据点填入单个列而违反了1NF。如果这两个值在两列中而不是一列中的两个值,这将更容易。如果可能的话,你应该改变设计......当然这并不总是可能的,我们必须摔倒以前不太理想的决定。 –

回答

0

您可以使用charindex()获取订单的父部分(直至连字符)并将其与'01'连接。有了这些,您可以加入到同一张表中以获取父订单描述。

select 
     Job = c.Name 
    , [Master Job Desc] = p.Descr 
    , [Description] = left(c.descr,30) 
    from or_order as c 
    left join or_order as p 
     on left(c.[order],charindex('-',c.[Order]))+'01' = p.[Order] 
    order by delivery asc, or_op.startsec asc 

rextester:http://rextester.com/GSN90790

create table or_order (
    [order] varchar(32) 
    , Name varchar(32) 
    , Descr varchar(32) 
); 

insert into or_order values 
    ('100-01','Name 1','Descr 1') 
    , ('100-02','Name 2','Descr 2') 
    , ('100-03','Name 3','Descr 3'); 

select 
    Job = c.Name 
    , [Master Job Desc] = p.Descr 
    , [Description] = left(c.descr,30) 
    from or_order as c 
    left join or_order as p 
     on left(c.[order],charindex('-',c.[Order]))+'01' = p.[Order] 

结果:

+--------+-----------------+-------------+ 
| Job | Master Job Desc | Description | 
+--------+-----------------+-------------+ 
| Name 1 | Descr 1   | Descr 1  | 
| Name 2 | Descr 1   | Descr 2  | 
| Name 3 | Descr 1   | Descr 3  | 
+--------+-----------------+-------------+ 
+0

父母和子女的工作订单是同一张表和同一列的一部分。唯一将它们联系在一起的是订单编号ex的前5个部分:100-01,100-02和部分相同,但101-01不同。他们在单独的行上,没有其他列告诉孩子他们的父母工作是什么。我没有设计数据库,我只是试图从中提取数据。 – Datallboy

+0

@Dallallboy添加了一个测试,告诉你我的意思。看起来我混淆了名为'order'的列与'name'列。 – SqlZim

+0

现在它更有意义。 C和P从哪里来? – Datallboy