这可以在没有子查询的情况下重写吗?

时间:2017-12-15 16:29:18

标签: sql sql-server

连接中select语句中的where子句需要传递这些值而不进行硬编码,但我不能只放置TN.id1 = b.id1,TN.id2 = b.id2等。 ..在那个声明中,因为它无法绑定。

SELECT 
a.DateCreated, 
*
from B1 b
LEFT JOIN
(
SELECT 
    MIN(GGI.DATE) DateCreated,
    GI.TEXT, 
    TN.ID1, 
    TN.ID2, 
    TN.ID3 
FROM TABLENAME TN
LEFT JOIN GITEM GI ON 
GI.SEQ_NBR = TN.SEQ_NBR
AND GI.STATUS = 'Approved'
WHERE 
    TN.ID1 = 'AP17' 
    AND TN.ID2 = '0' 
    AND TN.ID3 = '1'
GROUP BY GI.TEXT, TN.ID1, TN.ID2, TN.ID3
) a ON 
b.ID1 = a.ID1 
AND b.ID2 = a.ID2
AND b.ID3 = a.ID3
WHERE   b.ID1 = 'AP17' 
    AND b.ID2 = '0' 
    AND b.ID3 = '1'

这可以在没有子查询的情况下重写吗?

我正在尝试做这样的事情(摘自上面的查询):

    WHERE 
    TN.ID1 = b.ID1
    AND TN.ID2 = b.ID2 
    AND TN.ID3 = b.ID3
GROUP BY GI.TEXT, TN.ID1, TN.ID2, TN.ID3

示例数据:

表中的“Table1”我只关心第一行。

ID1  ID2 ID3  Text
AP17  0   1    Red
AP17  0   2    Green
AP17  0   3    Blue

表“Table2” - 从该表中我需要使用与最后一个表中第一行匹配的所有“SEQ_NBR”行来获取下一个表中的数据。

ID1 ID2 ID3  SEQ_NBR
AP17  0   1     1
AP17  0   1     2
AP17  0   1     3
AP17  0   2     4

表“Table3” - 我想为每个不同类型的“Item”创建行,最早的日期是Status设置为“A”

SEQ_NBR Status   Item         DATE
  1       I      APPLE     12/05/17
  2       A      APPLE     12/10/17
  3       A      APPLE     12/13/17
  1       A      Cup       12/05/17
  2       A      Cup       12/10/17
  3       A      Cup       12/13/17
  1       I      Item3     12/05/17
  2       I      Item3     12/10/17
  3       A      Item3     12/13/17

我拉的数据看起来像是这样的,在“Table3”中总是有最早的日期,状态设置为“A”:

DateCreated  ID1  ID2 ID3  Item
12/10/17     AP17  0   1   Apple
12/05/17     AP17  0   1   Cup
12/13/17     AP17  0   1   Item3

2 个答案:

答案 0 :(得分:1)

很确定这是一个基本的聚合查询。这将返回所提供的样本数据的所需输出。

select DateCreated = MIN(MyDate)
    , t2.ID1
    , t2.ID2
    , t2.ID3
    , t3.Item
from Table1 t1
join Table2 t2 on t2.ID1 = t1.ID1
                and t2.ID2 = t1.ID2
join Table3 t3 on t3.SEQ_NBR = t2.SEQ_NBR
                and t3.Status = 'A'
group by t2.ID1
    , t2.ID2
    , t2.ID3
    , t3.Item

答案 1 :(得分:0)

我相信你可以像这样重写。我猜错了一点,因为它并不是很明确,因为你说"重写我的查询以不使用上面的子查询"所以列出了所有要求。并且您的SQL只是通过id1,id2和id3获取特定结果。然后你给我们表格和要求改变为"这将始终具有最早的日期"表3"状态设置为" A""这不是你的SQL正在做什么。鉴于第二个要求并忽略了第一个要求:

SELECT
    git.date,
    table3.id1,
    table3.id2,
    table3.id3,
    b1.text
FROM
    gitem as git
    INNER JOIN table3 ON
        git.seq_nbr = table3.seq_nbr
    INNER JOIN b1 ON
        table3.id1 = b1.id1 AND
        table3.id2 = b1.id2 AND
        table3.id3 = b1.id3
WHERE
    git.status = 'A' AND
    git.date = (SELECT min(date) FROM gitem WHERE status='A')

这将拉出颜色,id1,id2,id3和日期,其中日期是第一个日期,状态为' A'。关于查询正在做什么似乎有点清楚,但它仍然使用子查询。只是根据您的要求,子查询才能找到正确的gitem记录。