2017-10-07 6 views
0

Voici mon sql, mais je pense que c'est trop complexe, et peut-être que ce n'est pas très rapide et efficace? ai-je raison? ou y a-t-il un meilleur moyen?Existe-t-il une meilleure façon de faire la requête?

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' 
+0

OK, j'utilise MSSQL – jasonLam

Répondre

1

Utilisation 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'; 

Note: Les conditions join peuvent avoir les tables mal. On ne sait pas quelle colonne est dans quelle table.

De même, si TTNum est déclaré en tant que grand nombre entier ou numérique, vous pouvez supprimer les guillemets simples autour de la valeur comparée.

Cette version fait faire une hypothèse. Il suppose qu'il n'y a pas plusieurs lignes dans le autre table pour un id donné. Si tel est le cas, il ne serait pas trop difficile d'ajuster la requête.

EDIT:

La façon de résoudre ce dernier problème est tout simplement:

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'; 

Ceci est probablement la meilleure forme pour la requête. Remarque: si TModelid peut être NULL, vous devez en tenir compte dans la deuxième condition ON.

+0

le TModelid ne sera pas NULL pour toujours. – jasonLam

+0

@jasonLam. . . Je ne suis pas sûr de savoir à quoi votre commentaire fait référence. Je dis juste que la deuxième condition dans la dernière requête serait 'ex.id = t.TEventInfoid ET (t.TModelid <> 3822 ou t.TModelId IS NULL)'. –

+0

ok, je vous ai. merci – jasonLam

1

Vous pouvez l'utiliser.

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' 
+0

3e trimestre, je pense qu'il est plus à l'aise – jasonLam

1

Comment vous diriez-vous cela? Je veux tous les événements où l'ID du modèle de billets est 3822 et toutes les pièces où il est 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 
+0

ouais, ça marche, mais je pense toujours que c'est trop complexe – jasonLam