如何从具有类似说明的mssql获取数据?

时间:2019-07-15 11:47:10

标签: sql sql-server

所以我有这样的表:

id | description          | code     | unit_value   | short
1  | awesome product DG   | CODEB14  | null         | BT
2  | awesome product      | CODE14   | 5005         | NOBT
3  | product less awe BGO | CODEB15  | null         | BT
4  | product less awe     | CODE15   | 5006         | NOBT

对于带有DG,BGO的项目,我需要显示'unit_value',但需要基于没有DG,BGO的项目。因此,“ awesome product DG”项具有与“ “很棒的产品”项目。但是我不能为'short = BT'的项目赋值。

因此,到目前为止,我有两个查询,其中有一些我想如何合并:

select value_i_need from my_table where short= 'BT'

select value_i_need from my_table where short!= 'BT' and description like '%awesome product%'

我不知道如何合并这两个查询?一些建议会很有帮助。

3 个答案:

答案 0 :(得分:0)

您只想要or吗?

select value_i_need
from my_table
where short = 'BT' or
      (short <> 'BT' and description like '%here is the name%')

答案 1 :(得分:0)

您需要将表的两个副本连接在一起

CREATE TABLE #mytable
(
    id INT,
    description VARCHAR(50),
    code VARCHAR(10),
    unitvalue INT NULL,
    short VARCHAR(10)
)

INSERT INTO #mytable
(
    id,
    description,
    code,
    unitvalue,
    short
)
VALUES
(1, 'awesome product DG'   , 'CODEB14'  , null ,'BT'),
(2, 'awesome product'      , 'CODE14'   , 5005 ,'NOBT'),
(3, 'product less awe BGO' , 'CODEB15'  , null ,'BT'),
(4, 'product less awe'     , 'CODE15'   , 5006 ,'NOBT');

SELECT a.description, a.code, b.description, b.code, b.short, b.unitvalue, a.description, a.short
FROM #myTable a
LEFT OUTER JOIN #myTable b ON a.description LIKE b.description + '%'
    AND b.short != 'BT'
WHERE a.short = 'BT'

但是,这有很多假设,即每行只有一个这样的项目,您没有类似名称的产品,而“ like”会混淆这两个项目。如果有任何种类的音量,加入“ like”也将很慢。因此,尽管这适用于这些琐碎的示例数据,但我不确定我是否建议您实际使用它。

在我看来,这些数据不应全部都放在同一张表中。您应该有一个带有BT条目的表,另一个带有NOBT条目和BT表的外键的表。也许?尚不清楚数据代表什么,但可能会为您指明正确的方向。

答案 2 :(得分:0)

您可以使用如下代码。您需要使用表别名(下面的T1和T2)来帮助匹配列。这是一个相关的子查询,假设存在完全匹配的一个。我会指出,LIKE会导致问题,如果您有多个匹配的产品,则会返回多行。

select (
         select unit_value
           from my_table T2
          WHERE T2.description like '%awesome product%'
            AND T2.short = 'NOBT'                
       )
  from my_table T1
 where T1.short= 'BT' AND T1.description LIKE '%awesome product%'