Je viens d'apprendre sur la coalesce et je me demande s'il est possible de fusionner une ligne complète de données entre deux tables? Sinon, quelle est la meilleure approche des ramblings suivants?
Par exemple, j'ai ces deux tables et en supposant que toutes les colonnes correspondent à: P>
tbl_Customers strong> p> Id Name Email Etc
-----------------------------------
1 Sue ... ...
2 Rick ... ...
3 Mary ... ...
4 Réponses :
SELECT Id, Name, Email, Etc FROM tbl_Employees
WHERE Id IN (SELECT ID From tbl_PeopleInID)
UNION ALL
SELECT Id, Name, Email, Etc FROM tbl_Customers
WHERE Id IN (SELECT ID From tbl_PeopleInID) AND
Id NOT IN (SELECT Id FROM tbl_Employees)
Depending on the number of rows, there are several different ways to write these queries (with JOIN and EXISTS), but try this first.This query first selects all the people from tbl_Employees that have an Id value in your target list (the table tbl_PeopleInID). It then adds to the "bottom" of this bunch of rows the results of the second query. The second query gets all tbl_Customer rows with Ids in your target list but excluding any with Ids that appear in tbl_Employees.The total list contains the people you want â all Ids from tbl_PeopleInID with preference given to Employees but missing records pulled from Customers.
+1 Évitez les NULLS En premier lieu, vous n'aurez plus besoin coalesce () code>! Bien que le récit de cette réponse ait été «haussié», le code utilise des opérateurs de relation sonores: Union, Semi Joindre ( dans code>) et semi différence ( non dans code>).
Je ne pense pas que la fonction Cet article devrait expliquer son application: p> http: // msdn.microsoft.com/en-us/library/ms190349.aspx P> On dirait que la réponse de Larry Lustig est plus dans les lignes de ce dont vous avez besoin. P> P> P > coalesce code> peut être utilisée pour ce que vous pensez. Coalecee CODE> est similaire à ISnull, sauf que cela vous permet de passer dans les colonnes multiples em> et de renvoyer la première valeur non nulle:
Vous pouvez également faire cela:
1) Rejoignez les deux tables sur tbl_employes.id = tbl_customers.id. Cela vous donnera toutes les lignes de tbl_employées et laissez les colonnes TBL_Customers null s'il n'y a pas de ligne de correspondance. P>
2) Utilisez le cas pour sélectionner la colonne TBL_employards ou Tbl_Customers, sur la base de si tbl_customers.id Est null, comme ceci: p> (ma syntaxe pourrait ne pas être parfaite là-bas, mais la technique est sonore). P> P>
J'essaie d'éviter des colonnes individuelles coalescentes, car les deux tables ont beaucoup de colonnes et pourraient augmenter au fil du temps.
@Johnc au lieu d'un cas code> code>, vous pouvez utiliser coalesce (tbl_employes.name, tbl_customers.name) Nom code> qui a la même sémantique si tbl_employes.name code > n'est pas null.
@Levitikon: faire un "Select *" avec un "Union tout" est fragile. Il faut que les deux tables soient exactement les mêmes pour toujours. Si une colonne est ajoutée à l'une ou l'autre table, il tombe en panne. Pour être plus résiliente face à de tels changements, je suggère de spécifier les noms de colonne.
Cela devrait être assez performant. Il utilise un CTE pour construire essentiellement une petite table de clients qui n'ont pas d'enregistrements d'employés assortis, puis il suffit de L'opérateur Union code> ce résultat avec les enregistrements d'employé dans code> peut être plutôt taxé sur de grandes requêtes, car il pourrait être nécessaire d'évaluer la sous-requête pour chaque enregistrement étant traité. p> p>
Aucune balise sur la question indique que c'est SQL Server, l'utilisateur peut donc ne pas avoir CTE disponible. En outre, les sous-requêtes ne nécessitent pas d'évaluation par ligne à moins qu'elles ne soient corrélées, ce qui n'est pas.
Très juste, une table Temp pourrait également prendre la place du CTE ci-dessus:
Quel est le but de la table code> tbl_peopleinid code>? On dirait que vous ne pouvez que
OUTER OUTER complet code> à partir detbl_employes code> àtbl_customers code> pour obtenir le résultat souhaité. Je suppose aussi que vous ne demandez pas de but pratique.Hey Martin, je suppose que le TBL_Peopleinis est trop dilué pour l'exemple. Je l'ai édité pour avoir un meilleur sens. Fondamentalement, une table pour les relations entre deux ensembles de données.