【问题标题】:Is there any better way to do the query?有没有更好的查询方法?
【发布时间】:2017-10-08 17:19:59
【问题描述】:

这是我的sql,但我觉得它太复杂了,可能不是很快和高效?我对吗?还是有更好的方法?

SELECT  TEventInfoid ,A.TTNum,
    CASE WHEN TModelid = 3822 THEN ( SELECT title
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  name
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END,
    CASE WHEN TModelid = 3822 THEN ( SELECT start_time
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  start_Time
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END,
    CASE WHEN TModelid = 3822 THEN ( SELECT [address]
                                     FROM   dbo.sns_event WHERE id=TEventInfoid
                                   )
         ELSE ( SELECT  [address]
                FROM    dbo.sns_exhibition WHERE id=TEventInfoid
              )
    END
   FROM    
       T_Ticktets A
   WHERE A.TTNum='100229143644'

【问题讨论】:

  • 好的,我用的是 MSSQL

标签: sql sql-server optimization


【解决方案1】:

使用LEFT JOIN:

SELECT t.TEventInfoid, t.TTNum,
       (CASE WHEN t.TModelid = 3822 THEN e.title ELSE ex.name END),
       (CASE WHEN t.TModelid = 3822 THEN e.start_time ELSE ex.start_time END),
       (CASE WHEN t.TModelid = 3822 THEN e.address ELSE ex.address END)
FROM T_Ticktets t LEFT JOIN
     dbo.sns_event e
     ON e.id = t.TEventInfoid LEFT JOIN  -- unclear which table which is in
     dbo.sns_exhibition ex
     ON ex.id = t.TEventInfoid AND
        e.id IS NULL                     -- unclear which table which is in
WHERE t.TTNum = '100229143644';

注意:join 条件可能包含错误的表。不清楚哪个列在哪个表中。

此外,如果 TTNum 被声明为大整数或数字,您可以在要比较的值周围去掉单引号。

这个版本确实做了一个假设。它假定 other 表中对于给定的id 没有多行。如果是这样,调整查询不会太难。

编辑:

解决最后一个问题的方法很简单:

SELECT t.TEventInfoid, t.TTNum,
        COALESCE(e.title, ex.name),
        COALESCE(e.start_time, ex.start_time),
        COALESCE(e.address, ex.address)
FROM T_Ticktets t LEFT JOIN
     dbo.sns_event e
     ON e.id = t.TEventInfoid AND t.TModelid = 3822 LEFT JOIN  -- unclear which table which is in
     dbo.sns_exhibition ex
     ON ex.id = t.TEventInfoid AND t.TModelid <> 3822          -- unclear which table which is in
WHERE t.TTNum = '100229143644';

这可能是查询的最佳形式。注意:如果TModelid 可能是NULL,则必须在第二个ON 条件中考虑到这一点。

【讨论】:

  • TModelid 不会永远为 NULL。
  • @jasonLam 。 . .我不确定你的评论指的是什么。我只是说最后一个查询中的第二个条件是ex.id = t.TEventInfoid AND (t.TModelid &lt;&gt; 3822 or t.TModelId IS NULL)
【解决方案2】:

你可以用这个。

   SELECT 
        TEventInfoid ,A.TTNum,
        CASE WHEN TModelid = 3822 THEN e.title ELSE x.name END,
        CASE WHEN TModelid = 3822 THEN e.start_time ELSE x.start_Time END,
        CASE WHEN TModelid = 3822 THEN e.[address] ELSE x.[address] END
    FROM    
       T_Ticktets A
       LEFT JOIN dbo.sns_event e ON e.id=A.TEventInfoid
       LEFT JOIN dbo.sns_exhibition x  WHERE x.id=A.TEventInfoid
     WHERE A.TTNum='100229143644'

【讨论】:

  • 3Q,我觉得更舒服
【解决方案3】:

你会如何对自己说这句话?我想要门票模型 id 为 3822 的所有活动以及不是 3822 的所有展品。

SELECT A.TEventInfoid,
A.TTNum,
e.Title,
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_event e
ON A.id = e.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid = 3822

UNION ALL

SELECT A.TEventInfoid,
A.TTNum,
e.Name   
e.start_time,
e.[address],
A.TModelid
FROM T_Ticktets A 
JOIN dbo.sns_exhibition e
ON e.id = A.TEventInfoid
WHERE A.TTNum='100229143644'
AND A.TModelid <> 3822

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多