Je suis parti rejoint une table (tableau A) constitué entièrement de dates avec une table (tableau B) avec des dates + des données avec - afin de disposer d'une entrée pour chaque semaine de l'année. Je sais que les jointures laissées causeront des doublons - mais j'ai besoin d'un moyen de vous débarrasser des dates en double contenant un champ NULL, tout en gardant toutes les autres dates (même si elles sont duplicates.
ROW Start of Week| Data | 1 | 2018-07-01 | NULL | 2 | 2018-07-01 | data | 3 | 2018-09-01 | NULL | 4 | 2018-10-03 | data | 5 | 2018-10-03 | data | 6 | 2018-10-03 | NULL | ------------------------
6 Réponses :
Je vais faire un coup de poignard sans savoir quelle est votre requête ou vos données existantes. Ici, je prends l'hypothèse qu'il y a une FK à Tablea et que vous utilisez SQL Server. En outre, je n'utiliserais pas cela avec un ensemble de données relativement petit car distinct code> est assez intensif de ressource. Sinon, je chercherais une solution à l'aide de la fonction Row_Number (). select distinct id, date, ISNULL(dataB, dataA) data
from (
select a.id, a.date, null as dataA, null as dataB
from tableA
union
select b.id, b.date, null as dataA, b.data as dataB
from tableB b
where data is not null
)
Vous n'obtiendrez pas la rangée n ° 3 avec cette approche, n'est-ce pas?
Ce qui a laissé rejoindre Retourne le résultat régulier de la participation interne.
@Gsazheniuk vous avez raison. Je n'ai pas lu la question à fond.
with non pas:
date | datacol 01/07/2018 | data 01/09/2018 | null 03/10/2018 | data 03/10/2018 | data
MERCI! Aurait pu mieux formuler ma question et aurait dû fournir plus de code, mais cela a résolu mon problème!
difficile à faire sans vos noms de colonne et tel, mais j'utiliserais où n'existe pas, j'ai intelligemment nommé votre identifiant de colonnes, TheDate et TheData: SO: p>
Ce SQL consiste à supprimer uniquement les enregistrements qui ont la valeur de TheData NULL et ont plusieurs enregistrements (compte> 1) lorsqu'ils sont regroupés par TheDate:
delete yourTable where theData is null and theDate in ( select theDate from yourTable group by theDate having count(*) > 1 )
Veuillez fournir une explication à la réponse. Il fait également face à la suppression par @Tmstack.
Je ne vois pas pourquoi vous obtenez des lignes 1 et 6 en premier lieu ...
Vous avez dit "Je sais que les jointures de gauche causeront des doublons" Pourquoi? Les seuls doublons qui devraient se produire sont ceux avec des dates correspondant au tableau B .. Tels que 20181003 dans votre exemple. Je ne vois pas pourquoi vous obtenez des lignes 1/6 dans la première place .. p>
(Utilisation de MySQL comme dB dans ce Exemple de réexter ) P>
SELECT *
FROM (SELECT cast("20180701" as date) as MyDate union all
SELECT cast("20180901" as date) union all
SELECT cast("20181003" as date)) A
LEFT JOIN (
SELECT cast("20180701" as date) as MyDate, 'data' dat union all
SELECT cast("20181003" as date), 'data' dat union all
SELECT cast("20181003" as date), 'data' dat) B
on A.MYDate = B.MyDate
and B.Dat is not null <-- so do this to solve the problem...
Le tableau A était une "colonne vertébrale" composée de toutes semaines au cours d'une année donnée. Le tableau B a été une table composée de données qui se sont déroulées sur des semaines données, donc après avoir rejoint les deux, les dates du tableau B également dans le tableau A étaient également dupliquées, bien qu'une date avaient une donnée et l'autre ait été nulle (du tableau A). Je suis correct avec les données NULL pendant quelques semaines, s'il n'y a pas de match de Table B, cependant, s'ils partagent une date, je voudrais seulement voir la semaine avec les données et non la date avec les colonnes de données vides du tableau A.
Voici le code SQL de travail:
ROW Start of WEEK data RowNo 2 2018-07-01 00:00:00.000 data1 1 3 2018-09-01 00:00:00.000 NULL 1 4 2018-10-03 00:00:00.000 data2 2 5 2018-10-03 00:00:00.000 data3 1
Modifiez votre question et fournissez des exemples de données et la requête (peut-être simplifiée) que vous utilisez.
Les données sont-elles uniques ou peuvent également être dupliquées?
Quels RDBM utilisez-vous?
À quoi ressemble vos conditions de jointure? Si vous vous joignez juste au champ de date 1 ne devriez-vous pas jamais arriver ... ni 6 ....
Sélectionnez A.MyDate, B.Data Gauche JOIN B sur A.MyDate = B.BDate et B .Data n'est pas NULL code> Ils ne se produisent pas, car une fois qu'une date a une donnée dans B, il ne peut pas être null ... Afficher les échantillons de données dans les deux tables, provoquant 2018-07-01 Null et Data .. .. de votre requête ...Pourquoi avez-vous besoin de garder les deux rangées 4 et 5, ce sont des lignes en double, n'est-ce pas?